我有一个清单 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?
这两个版本在逻辑上是相同的,应产生相同的结果,并且还应具有相似的性能。您实际应该使用的版本是第二个版本:
\b(?:AA|CC|DD|EE)\b
原因是它更简洁,并且避免了不必要地为每个术语重复单词边界。这个正则表达式表示匹配交替中的任何一个术语,两端带有单词边界。关于“组”,?:
括号内的内容实际上关闭了捕获组,因此至少从性能的角度来看,它实际上并不存在。需要使用括号,以避免为每个术语重复单词边界,这是第一个版本所做的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句