我的目标是在文本中找到一个单词。需要注意的是,我需要将撇号视为文本。
让我举个例子来解释一下。假设我在文本中寻找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")
,但没有用。
如何让我的正则表达式将撇号视为文本?
编辑:我未提及的一些边缘情况:'don
和don'
是正确的匹配,而t'don
,don't
和'don'
则不是。
答案 0 :(得分:5)
使用否定的前瞻声明:
r'(?:\b)%s(?!\'\w)(?:\b)'
我已经通过演示将其放在regex101上。
否定前瞻使表达式仅匹配don
,如果它不紧跟'\w
。您的版本仍然匹配,因为(?:\b|\'\w)
中的两个选项都匹配。
答案 1 :(得分:1)
您可以使用以下内容将所有'
视为匹配中的字词:
r"(?<!')\b%s\b(?!')"
它使用负向前瞻和负面后瞻,以确保您想要匹配的单词周围没有'
。
编辑:在你的边缘案例之后,我会建议这个正则表达式:
r"(?<!\w')(?<!'(?=%s'))\b%s\b(?!'\w)" % re.escape("don")
匹配时:
don't
o'don
'don'
don'
'don
只有最后两场比赛。
EDIT2:如果您仍想匹配以'
结尾或开头的字符串,那么我建议您回过头来获取字边界的'旧方法',即尝试匹配空格和行的开头/结尾:
(?<!\w')(?<!'(?=%s'))(?<=\b|^|\s)%s(?=\b|^|\s)(?!'\w)