所以我试图将文件的每一行与正则表达式匹配,然后执行以下操作:
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()
谢谢!
答案 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)
结果将是所有比赛的列表。