使用动态正则表达式匹配字符串中的整个单词

kyr*_*nia 3 python regex python-2.7

我期待看一个单词是否出现在使用正则表达式的句子中.单词用空格分隔,但两边可能都有标点符号.如果单词位于字符串的中间,则以下匹配有效(它可防止部分单词匹配,允许单词两侧的标点符号).

match_middle_words = " [^a-zA-Z\d ]{0,}" + word + "[^a-zA-Z\d ]{0,} "
Run Code Online (Sandbox Code Playgroud)

然而,这不会匹配第一个或最后一个单词,因为没有尾随/前导空格.所以,对于这些情况,我也一直在使用:

match_starting_word = "^[^a-zA-Z\d]{0,}" + word + "[^a-zA-Z\d ]{0,} "
match_end_word = " [^a-zA-Z\d ]{0,}" + word + "[^a-zA-Z\d]{0,}$"
Run Code Online (Sandbox Code Playgroud)

然后结合

 match_string = match_middle_words  + "|" + match_starting_word  +"|" + match_end_word 
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法可以避免需要三个匹配项.具体来说,是否有一种方法可以指定'以太空格或文件的开头(即"^")和类似的',是空格还是文件末尾(即"$")?

Wik*_*żew 9

为什么不使用单词边界?

match_string = r'\b' + word + r'\b'
match_string = r'\b{}\b'.format(word)
match_string = rf'\b{word}\b'          # Python 3.7+ required
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您将确保仅在非字字符包围时捕获该字.还要注意words字符串开头和结尾的匹配.所以,添加3个替代品是没有用的.

示例代码:

match_string = r'\b(?:{})\b'.format('|'.join(words))
match_string = rf'\b(?:{"|".join(words)})\b'         # Python 3.7+ required
Run Code Online (Sandbox Code Playgroud)

我们找到了3场比赛:

import re
strn = "word hereword word, there word"
search = "word"
print re.findall(r"\b" + search + r"\b", strn)
Run Code Online (Sandbox Code Playgroud)