Python正则表达式匹配换行符
我有一个正则表达式:
[0-9]{8}.*\n.*\n.*\n.*\n.*
我在Expresso这个工具里测试过,跟我正在处理的文件对比,结果是匹配成功的。
我想要匹配以下内容:
- 参考编号,长度为8个数字
- 任意字符,可以出现任意次数
- 换行符
- 任意字符,可以出现任意次数
- 换行符
- 任意字符,可以出现任意次数
- 换行符
- 任意字符,可以出现任意次数
- 换行符
- 任意字符,可以出现任意次数
我的Python代码是:
for m in re.findall('[0-9]{8}.*\n.*\n.*\n.*\n.*', l, re.DOTALL):
print m
但是没有匹配到任何结果,Expresso里显示有400多个匹配,这正是我期待的结果。
我这里缺少了什么呢?
1 个回答
12
不要使用 re.DOTALL
,否则点号也会匹配换行符。同时,使用原始字符串 (r"..."
) 来写正则表达式会更好:
for m in re.findall(r'[0-9]{8}.*\n.*\n.*\n.*\n.*', l):
print m
不过,你的版本其实应该是可以工作的(尽管效率很低),前提是你把整个文件作为一个大字符串以二进制形式读入内存。
所以问题是,你是这样读取文件的吗:
with open("filename","rb") as myfile:
mydata = myfile.read()
for m in re.findall(r'[0-9]{8}.*\n.*\n.*\n.*\n.*', mydata):
print m
还是说你是逐行读取的(比如用 for line in myfile:
或 myfile.readlines()
)?如果是这样的话,正则表达式就没法正常工作了,当然。