Python正则表达式匹配换行符

9 投票
1 回答
41652 浏览
提问于 2025-04-16 04:16

我有一个正则表达式:

[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())?如果是这样的话,正则表达式就没法正常工作了,当然。

撰写回答