python -regex匹配和逐行运行文件的循环

时间:2012-10-03 17:55:29

标签: python regex file loops for-loop

所以我试图将文件的每一行与正则表达式匹配,然后执行以下操作:

import re
regex='\S+\s+(\S{6})\s+VAR'
with open('/home/jyt109/humsavar.txt') as humsavar:
    for line in humsavar:
        match=regex.search(line)
        print match.group(1)

预期输出是每行中特定的6个字符,而不是我得到如下错误:

Traceback (most recent call last):
  File "exercise.py", line 74, in <module>
    match=regex.search(line)
AttributeError: 'str' object has no attribute 'search'

我发现(从下面的链接)要将正则表达式与文件的每一行匹配,该文件必须首先通过file.read()

转换为列表

Match multiline regex in file object

要重新发布帖子,有没有更简单的方法(最好是超过1行而不是2行)?

humsavar=open('/home/jyt109/humsavar.txt')
text=humsavar.read()

谢谢!

3 个答案:

答案 0 :(得分:4)

我想你可能误解了那个链接的含义。如果正则表达式的匹配项可以跨越多行,则需要使用file.read()读取该文件。如果换行永远不会成为匹配的一部分,那么您可以逐行读取文件并尝试分别匹配每一行。

如果要分别检查每一行,可以使用file.readlines()获取行列表或仅迭代文件对象,例如:

with open('/home/jyt109/humsavar.txt') as f:
    for line in f:
        match = regex.search(line)

假设你仍然想要一次读取整个文件内容,你可以在一行上这样做:

text = open('/home/jyt109/humsavar.txt').read()

答案 1 :(得分:2)

这是一个简单的单行。我在下面的数据文件中测试了它。使用正则表达式时,可以方便地使用Raw String Notation,如下所示。我不知道你的数据文件是什么样的,但我刚刚创建了一个与你指定的搜索模式匹配的文件。

<强>码

import re
print re.findall(r'\S+\s+(\S{6})\s+VAR', open('/tmp/test.txt').read())

<强>输出

['000001', '000002', '123456']

<强>的test.txt

x 000001 VAR
x 000002 VAR
x 123456 VAR

答案 2 :(得分:0)

.read()不会将文件转换为列表(.readlines()会这样做);相反,它将整个文件放入一个字符串。

但即便如此,您也可以使用正则表达式:使用re.MULTILINE进行编译时,锚点^$将匹配各行的开头和结尾:

>>> regex = re.compile(r"^Match this regex in each line$", re.MULTILINE)
>>> regex.findall(text)

结果将是所有比赛的列表。