我想使用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't
和can`t
(。
这是相当笨拙的,因为我想加上所有常见的收缩。有没有更好的方法可以用regex实现这一点,我可以通过输入一个收缩列表来构造这种类型的regex?还是我最好就这样把它们都列出来?
也可以只处理结尾,比如'll
、n'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"))
- 它匹配一个或多个字母
[A-Za-z]+
- 方括号中的单词表示其中一个字符,加号表示前面的至少一个或多个字符
后面跟着以下
'
或`之一后面跟着一个或多个字母
并将其替换为
- 在第一组括号
r'1'
中发现了什么
- r'\1'返回第一个
([A-Za-z]+)
匹配的模式
- 然后是第二组括号
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
观看现场演示。