在Python 2.7.3中使用正则表达式来搜索文本和输出匹配项

时间:2013-03-27 01:02:07

标签: python regex text-files

我正在努力完成标题所说的内容。该程序用于从指定路径读取.txt文件并匹配代码中指定的术语。这就是我到目前为止所做的:

import re

source = open("C:\\test.txt", "r")
lines = []

for line in source:
    line = line.strip()
    lines.append(line)
    if re.search('reply', line):
        print 'found: ', line

正如您所看到的,我使用re.search指定了“回复”一词,但这限制了我一个术语。我知道有一种方法可以指定要搜索的单词列表或字典,但我的尝试失败了。我认为可以创建一个类似......的列表

keywords = ['reply', 'error', 'what'] 

...但是尽管我在这个网站上已经阅读过,但我似乎无法将其正确地纳入代码中。非常感谢任何建议或协助!

PS。如果我想让搜索区域敏感,我是否可以使用...

"(.*)(R|r)eply(.*)"

...在我想要找到的术语列表中?

2 个答案:

答案 0 :(得分:3)

一种方式:

import re
source = open("input", "r")
lines = []
keywords = ['reply', 'error', 'what']
# join list with OR, '|', operators
# re.I makes it case-insensitive
exp = re.compile("|".join(keywords), re.I)
for line in source:
    line = line.strip()
    lines.append(line)
    if re.search(exp, line):
        print 'found: ', line

答案 1 :(得分:1)

使用re.search(),您传递一个字符串,但您可以指定非常复杂的模式。请参阅Python re module上的文档,其中有一节“正则表达式语法”。

事实上,您在问题中得到了答案...... "R|r"搜索“R”或“r”,因此"reply|error|what"搜索“回复”,“错误”或“什么”

  

PS。如果我想让搜索区域敏感,我是否可以使用...   “(.*)(R|r)eply(.*)

不需要.*位(它可能会使您的代码变慢)。 re.search()函数在字符串中查找匹配 where (R|r)eply会查找“回复”或“回复”,但不会与“回复”或“回复”匹配。

如果您想要不区分大小写的搜索,可以使用flags=re.IGNORECASE选项传递给re.search()。 E.g:

re.search('reply', line, flags=re.IGNORECASE)