Python:regex,用于在多行输入中排除字符串/单词

Python:regex,用于在多行输入中排除字符串/单词,python,regex,Python,Regex,在使用Python2.7.3正则表达式在大输入中查找带有新行字符的字符串时,我遇到了一些问题。我有这样的想法: type="thing" blahblahblah something id="123456" ... type="disabled thing" blahblahblah somethingelse id="123457" ... 我想在type=“thing”中获取所有ID。由于贪婪的正则表达式引擎,我必须编写一个正则表达式,如: r'type="thing"(?!type).+

在使用Python2.7.3正则表达式在大输入中查找带有新行字符的字符串时,我遇到了一些问题。我有这样的想法:

type="thing" blahblahblah
something id="123456"
...
type="disabled thing" blahblahblah
somethingelse id="123457"
...
我想在type=“thing”中获取所有ID。由于贪婪的正则表达式引擎,我必须编写一个正则表达式,如:

r'type="thing"(?!type).+id="[0-9]{6,7}"', re.S

然而,这不起作用。如何在输入中使用此类数据生成排除字符串正则表达式?

如果我正确理解您的问题(在编辑之前),您需要两行与id关联的内容。在这种情况下,您需要沿着这些行添加内容(假设新行用“\n”标记):

如果不使用re.S,可以更有效地控制表达式的贪婪程度。您的
+
re.S
组合将使您的表达式变得贪婪,否则您将不得不对此进行解释。您还可以使用类似于
+?
的内容。加号后面的问号会让你的表达不贪婪,但我会选择一个更简洁的表达。

使用这个:

r'type="thing"[\s\S]+?id="([0-9]{6,7})"', re.S
例如:

import re

s = b'''"type="thing" blahblahblah
something id="123456"
....
type="thing" blahblahblah
something id="123459"
....
type="disabled thing" blahblahblah
somethingelse id="123457"'''

expr = re.compile(r'type="thing"[\s\S]+?id="([0-9]{6,7})"', re.S);

c = expr.findall(s)

for c1 in c:
    print ".."
    print c1
输出:

>>> 
..
123456
..
123459

所以,您需要
type=“disabled thing”
?我并没有注意到每个块的标题都有固定的行数。。。谢谢,这很有效!您能解释一下“?”登录“[\s\s]*?”的作用吗?它匹配所有字符,包括换行符。我试图阻止贪婪,但却没有成功。。。需要
+?
。我很好奇为什么您选择[\s\s]而不是简单的点()。
>>> 
..
123456
..
123459