使用RegEx进行多次不同的替换

时间:2015-10-08 19:01:36

标签: python regex

我正在尝试编写一些Python代码,它将使用RegEx替换一些不需要的字符串。我写的代码来自本网站上的另一个问题。

我有一个文字:

text_1=u'I\u2019m \u2018winning\u2019, I\u2019ve enjoyed none of it. That\u2019s why I\u2019m withdrawing from the market,\u201d wrote Arment.'

我想删除所有\ u2019m,\ u2019s,\ u2019ve等等。

我写的代码如下:

rep={"\n":" ","\n\n":" ","\n\n\n":" ","\n\n\n\n":" ",u"\u201c":"", u"\u201d":"", u"\u2019[a-z]":"", u"\u2013":"", u"\u2018":""}
rep = dict((re.escape(k), v) for k, v in rep.iteritems())
pattern = re.compile("|".join(rep.keys()))
text = pattern.sub(lambda m: rep[re.escape(m.group(0))], text_1)  

该代码适用于:

"u"\u201c":"", u"\u201d":"", u"\u2013":"" and u"\u2018":""

然而,它对于以下方面的效果并不好:

u"\u2019[a-z]  : The presence of [a-z] turns rep into \\[a\\-z\\] which doesnt match.

我要找的输出是:

text_1=u'I winning, I enjoyed none of it. That why I withdrawing from the market,wrote Arment.'

我如何实现这一目标?

3 个答案:

答案 0 :(得分:1)

这里的问题实际上是转义,这段代码可以更直接地执行您想要的操作:

remove = (u"\u201c", u"\u201d", u"\u2019[a-z]?", u"\u2013", u"\u2018")
pattern = re.compile("|".join(remove))
text = pattern.sub("", text_1)

我已将?添加到u2019比赛中,因为我认为考虑到你的测试字符串,你想要的是什么。

为了完整起见,我认为我还应该链接到Unidecode包,这可能与您尝试通过删除这些字符实现的更接近。

答案 1 :(得分:1)

有关换行符的信息完全改变了答案。为此,我认为使用循环构建表达式实际上不如在模式本身中使用更好的格式更清晰。

replacements = {'newlines': ' ',
                'deletions': ''}
pattern = re.compile(u'(?P<newlines>\n+)|'
                     u'(?P<deletions>\u201c|\u201d|\u2019[a-z]?|\u2013|\u2018)')

def lookup(match):
    return replacements[match.lastgroup]

text = pattern.sub(lookup, text_1)

答案 2 :(得分:0)

最简单的方法是此正则表达式:

X = re.compile(r'((\\)(.*?) ')
text = re.sub(X, ' ', text_1)