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

Combine words from list to single regex with word boundary

我有一个列表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)?任何人都可以指出提到这个 属性 括号的 link 吗? 两个选项哪个更correct/pythonic?

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

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

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