我想用正则表达式去掉常用缩略语中的撇号。例如,我想要地图
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
等等,但是我害怕用这个来捕捉除了收缩之外的其他东西
您可以简单地这样做:
我会这样做
[A-Za-z]+
后跟以下
'
或`后跟一个或多个字母
并将其替换为
r'\1'
([A-Za-z]+)
匹配的模式r'\2'
如果您有其他字符,例如�, 你们知道它们都是什么,你们可以把它们放在方括号里。这一行将匹配这些字符中的任何一个,并通过撇号解释出现空白的可能性
您也可以使用
[^A-Za-z0-9]
匹配任意数量的字符,后跟非字母或数字的任何字符,后跟任意数量的字符。如果您想在其中添加
\s?
,我建议您添加\.
、\?
、\!
、\:
。。。给你的正则表达式做'([A-Za-z]+)\s?[^A-Za-z0-9\.\!\?\:]s?([A-Za-z]+)'
,因为否则你的正则表达式会匹配句子的结尾,而不是收缩这将匹配任何收缩,无论撇号之前或之后有多大字母。您需要将所有不同的撇号放在['`]块中
正则表达式可以让您轻松列出一组备选方案
在
re.sub
中,后面的引用\1
也在替换中调用与第一个括号内的子表达式匹配的文本。(\2
获取第二个,以此类推)注意还添加单词边界锚{{CD4}}以防止正则表达式在较长单词的中间匹配,如VOL>强> CANIT Y。p>
相关问题 更多 >
编程相关推荐