Python:regex,用于在多行输入中排除字符串/单词
在使用Python2.7.3正则表达式在大输入中查找带有新行字符的字符串时,我遇到了一些问题。我有这样的想法: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).+
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