正则表达式适用于 sublime 文本搜索,但不适用于 python 脚本

Regexp works with sublime text search but not from python script

我想使用正则表达式搜索文件内容。该文件的示例是:

3 General 24
3.1 CR IOT133 (ID: 194) 24
3.1.1 Issue 24
4 Integration 25
4.11 CR IOT025 (ID: 125) 25
10.27 CR IOT111 (ID: 176) 77

我想提取 IOTxxx 部分(所以在这个例子中是第 2、5 和 6 行)

我的脚本是:

import re
fhandle = open("CR_headers.txt")
inp = fhandle.read()
crnumlist = re.findall('^\d{1,2}\.\d{1,2} CR (IOT\d{3}).*$', inp)
print crnumlist

最后一条语句打印一个空列表。我也从控制台尝试了 运行,但结果是一样的。

如果我使用带有输入的 sublime text 查找:^\d{1}\.\d{1} CR (IOT\d{3}).*$ 我可以得到匹配的行。

在 windows 7 盒子上使用 python 版本 2.7.10 和 sublime text 2

任何关于我做错的想法都将不胜感激。谢谢

您只需要包含多行修饰符并将您的正则表达式定义为原始字符串。当满足这两个条件时,您必须使用多行修饰符。

  • 只要在您的输入正则表达式中使用锚 ^$
  • 当输入的字符串超过一行时

    crnumlist = re.findall(r'(?m)^\d{1,2}\.\d{1,2} CR (IOT\d{3}).*$', inp)
    

示例:

>>> s = '''3 General 24
3.1 CR IOT133 (ID: 194) 24
3.1.1 Issue 24
4 Integration 25
4.11 CR IOT025 (ID: 125) 25
10.27 CR IOT111 (ID: 176) 77'''
>>> re.findall(r'(?m)^\d{1,2}\.\d{1,2} CR (IOT\d{3}).*$', s)
['IOT133', 'IOT025', 'IOT111']
>>> re.findall(r'^\d{1,2}\.\d{1,2} CR (IOT\d{3}).*$', s)
[]