Python正则表达式删除缩写中的撇号



我想使用regex来删除常见缩写中的撇号。例如,我想绘制

test1 test2 can't test3 test4 won't

test1 test2 cant test3 test4 wont

我目前天真的方法只是手动细分我想使用的所有收缩。

def remove_contraction_apostrophes(input):
text = re.sub('can.t', 'cant', input)                                       
text = re.sub('isn.t', 'isnt', text)                                       
text = re.sub('won.t', 'wont', text)                                       
text = re.sub('aren.t', 'arent', text)  
return text

(我使用can.t是因为在我解析的文本中,它可以使用多个字符作为撇号,如can'tcan`t(。

这是相当笨拙的,因为我想加上所有常见的收缩。有没有更好的方法可以用regex实现这一点,我可以通过输入一个收缩列表来构造这种类型的regex?还是我最好就这样把它们都列出来?

也可以只处理结尾,比如'lln't等,但我害怕用这个来捕捉除了收缩之外的其他东西。

我会这样做。

import re
def remove_contraction_apostraphes(input):
text = re.sub('([A-Za-z]+)['`]([A-Za-z]+)', r'1'r'2', input)                                       
return text
print(remove_contraction_apostraphes("can't"))

  1. 它匹配一个或多个字母[A-Za-z]+
  • 方括号中的单词表示其中一个字符,加号表示前面的至少一个或多个字符
  1. 后面跟着以下'或`之一

  2. 后面跟着一个或多个字母

并将其替换为

  1. 在第一组括号r'1'中发现了什么
  • r'\1'返回第一个([A-Za-z]+)匹配的模式
  1. 然后是第二组括号r'2'中的内容

如果您有其他字符,例如�,你知道它们都是什么,你可以把它们放在方括号里。这一行将匹配这些字符中的任何一个,并考虑到撇号出现空白的可能性

text = re.sub('([A-Za-z]+)s?['`�]s?([A-Za-z]+)', r'1'r'2', input)       
  • /s:任何空白
  • ?:上一个的0或1

您也可以使用[^A-Za-z0-9]

text = re.sub('([A-Za-z]+)[^A-Za-z0-9]([A-Za-z]+)', r'1'r'2', input)     

匹配任意数量的字符,后跟任何非字母或数字的字符,再后跟任意数量的字符串。如果你想在那里添加s?,我建议添加.?!:。。。对于您的正则表达式,使其成为'([A-Za-z]+)s?[^A-Za-z0-9.!?:]s?([A-Za-z]+)',因为否则您的正则正则表达式将匹配像句子结尾这样的东西,而不是缩写


这将匹配任何收缩,无论撇号前后有多少字母。您需要将所有不同的撇号放在[`]块中

正则表达式使您可以轻松地列出一组备选方案。

def remove_contraction_apostrophes(input):
text = re.sub(r'b(are|ca|is|wo)n.tb', r'1nt', input)
text = re.sub(r'b(I|[hw]e|it|she|they|you).llb', r'1ll', text)

re.sub中,后引用1也调用替换中与第一个带括号的子表达式匹配的文本。(2获得第二个,等等(

还要注意添加了单词基本锚b,以防止正则表达式在较长单词的中间匹配,如volcanity

您可以简单地这样做:

t="test1 test2 can't test3 test4 won't"
re.sub("'","",t)

使用环视检查"撇号":

text = re.sub("(?<=w)[‘`’'](?=w)", '', input) 

环视在不消耗前/后输入的情况下断言。

----

import re
input = "I can’t understand what's wrong"
text = re.sub("(?<=w)[‘`’'](?=w)", '', input)
print(text)

生成

I cant understand whats wrong

观看现场演示。

最新更新