Python正则表达式:将撇号视为文本

时间:2014-01-21 18:24:44

标签: python regex

我的目标是在文本中找到一个单词。需要注意的是,我需要将撇号视为文本。

让我举个例子来解释一下。假设我在文本中寻找don这个词:don't trust don。我需要匹配don而不是don't

我从这个正则表达式开始:r'(?:\b)%s(?:\b)' % re.escape("don")但在这里它匹配don的两次出现。然后我试了r'(?:\b|\w\')%s(?:\b|\'\w)' % re.escape("don"),但没有用。

如何让我的正则表达式将撇号视为文本?

编辑:我未提及的一些边缘情况:'dondon'是正确的匹配,而t'dondon't'don'则不是。

2 个答案:

答案 0 :(得分:5)

使用否定的前瞻声明:

r'(?:\b)%s(?!\'\w)(?:\b)'

我已经通过演示将其放在regex101上。

否定前瞻使表达式仅匹配don ,如果它不紧跟'\w。您的版本仍然匹配,因为(?:\b|\'\w)中的两个选项都匹配。

答案 1 :(得分:1)

您可以使用以下内容将所有'视为匹配中的字词:

r"(?<!')\b%s\b(?!')"

它使用负向前瞻和负面后瞻,以确保您想要匹配的单词周围没有'

regex101 demo


编辑:在你的边缘案例之后,我会建议这个正则表达式:

r"(?<!\w')(?<!'(?=%s'))\b%s\b(?!'\w)" % re.escape("don")

regex101 demo

匹配时:

don't
o'don
'don'
don'
'don

只有最后两场比赛。


EDIT2:如果您仍想匹配以'结尾或开头的字符串,那么我建议您回过头来获取字边界的'旧方法',即尝试匹配空格和行的开头/结尾:

(?<!\w')(?<!'(?=%s'))(?<=\b|^|\s)%s(?=\b|^|\s)(?!'\w)

Previous sentence demo

New test case demo