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

2024-04-20 03:05:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用正则表达式去掉常用缩略语中的撇号。例如,我想要地图

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等等,但是我害怕用这个来捕捉除了收缩之外的其他东西


Tags: 方法textreinput地图canregextest1
3条回答

您可以简单地这样做:

t="test1 test2 can't test3 test4 won't"
re.sub("\'","",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.t\b', r'\1nt', input)
    text = re.sub(r'\b(I|[hw]e|it|she|they|you).ll\b', r'\1ll', text)

re.sub中,后面的引用\1也在替换中调用与第一个括号内的子表达式匹配的文本。(\2获取第二个,以此类推)

注意还添加单词边界锚{{CD4}}以防止正则表达式在较长单词的中间匹配,如VOL>强> CANIT Y。p>

相关问题 更多 >