尽管Python社区中的许多人经常对正则表达式表示反感,对于适当的用例来说,它们确实是一个宝贵的工具——其中肯定包括识别单词和短语(感谢正则表达式模式中的\b“单词边界”元素——基于字符串处理的替代方案更是一个问题,例如。,.split()使用空格作为分隔符,因此令人恼火的是,将标点符号附加到与其相邻的单词上,等等)。
如果RE是好的,我会推荐如下:import re
import sys
def main():
if len(sys.argv) != 3:
print("Usage: %s fileofstufftofind filetofinditin" % sys.argv[0])
sys.exit(1)
with open(sys.argv[1]) as f:
patterns = [r'\b%s\b' % re.escape(s.strip()) for s in f]
there = re.compile('|'.join(patterns))
with open(sys.argv[2]) as f:
for i, s in enumerate(f):
if there.search(s):
print("Line %s: %r" % (i, s))
main()
第一个参数是要查找单词或短语的文本文件的路径,每行一个,第二个参数是要查找单词或短语的文本文件的路径。如果需要的话,很容易使大小写搜索不敏感(可能只是基于命令行选项开关的选择性),等等
对不熟悉REs.的读者的一些解释:
patterns项中的\b项确保不会出现意外匹配(如果您正在搜索“cat”或“dog”,则不会看到“catalog”或“underdog”的意外命中;并且不会错过“The cat,smileing,run away”中的命中,因为某些人认为存在“cat”这个词,包括逗号;-)。
|项表示or,例如,来自包含内容(两行)的文本文件cat
dog
这将形成模式'\bcat\b|\bdog\b',它将定位“猫”或“狗”(作为独立单词,忽略标点符号,但拒绝较长单词中的点击)。
re.escape转义标点符号,因此它是按字面匹配的,而不是像通常在RE模式中那样具有特殊意义。