将列表中的单词合并到带有单词边界的单个正则表达式

时间:2019-07-20 13:10:23

标签: regex python-3.x regex-group

我有一个列表l = [AA, CC, DD, EE]

我在文件中有很多字符串,我想从列表中查找包含所有确切单词的字符串。我不想获取与特定字符串匹配的单词。阅读其他SO问题,我得到建议,主要通过以下两种方式将列表合并为一个正则表达式

1. \bAA\b|\bCC\b|\bDD\b|\bEE\b     ==> r"\b%s\b" % r"\b|\b".join(l)
2. \b(?:AA|CC|DD|EE)\b             ==> r"\b(?:%s)\b" % "|".join(l)

上面右边提到的连接只是一个例子,并不是问题的一部分。

运行代码,它们都给出相同的正确答案,而timit给出相似的时序。 如果我不在乎列表中匹配的单词,是否像选项2一样需要分组?为什么选项2的末尾有字边界?这是否意味着它适用于括号内的所有单词,即等同于(?:\bAA\b|\bCC\b|\bDD\b|\bEE\b)?谁能指向一个提到括号属性的链接? 这两个选项是否更正确/ pythonic?

1 个答案:

答案 0 :(得分:2)

这两个版本在逻辑上是相同的,应产生相同的结果,并且还应具有相似的性能。您实际应该使用的版本是第二个版本:

\b(?:AA|CC|DD|EE)\b

原因是它更简洁,并且避免了不必要地为交替中的每个术语重复单词边界。这个正则表达式表示匹配交替中的任何一个术语,两端都带有单词边界。关于“组”,括号内的?:实际上关闭了捕获组,因此至少从性能的角度来看,它实际上并不存在。为了避免重复每个单词的单词边界,需要使用括号,这是第一个版本的作用。