3

所以我试图将文件的每一行与正则表达式匹配,我做了以下事情:

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() 将文件转换为列表

匹配文件对象中的多行正则表达式

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

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

谢谢!

4

3 回答 3

5

我想你可能误解了那个链接在说什么。如果您的正则表达式匹配可以跨越多行,那么您需要使用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()
于 2012-10-03T18:00:08.063 回答
3

这是一个简单的单行。我在下面的数据文件上对其进行了测试。使用正则表达式时,使用原始字符串表示法很方便,如下所示。我不知道您的数据文件应该是什么样子,但我只是制作了一个与您指定的搜索模式相匹配的文件。

代码

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

输出

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

测试.txt

x 000001 VAR
x 000002 VAR
x 123456 VAR
于 2012-10-03T19:42:35.750 回答
1

.read()不会将文件变成列表(.readlines()does);相反,它将整个文件放入一个字符串中。

但即使那样你也可以使用正则表达式:当用 编译它时re.MULTILINE,锚点^$将匹配各行的开始和结束:

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

结果将是所有匹配项的列表。

于 2012-10-03T18:00:09.960 回答