尝试使用Python 2.7.3正则表达式使用新行字符在大输入中查找某些字符串时遇到问题。我有这样的事情:
type="thing" blahblahblah
something id="123456"
...
type="disabled thing" blahblahblah
somethingelse id="123457"
...
我希望得到所有id = type =“thing”。由于贪婪的正则表达式引擎,我必须编写一个正则表达式:
r'type="thing"(?!type).+id="[0-9]{6,7}"', re.S
然而,这不起作用。如何在输入中使用此类数据创建排除字符串正则表达式?
答案 0 :(得分:0)
如果我正确理解了您的问题(在编辑之前),您需要与ID相关联的两行。在这种情况下,您将需要沿着这些方向的某些内容(假设新行标有'\ n'):
>>> import re
>>> t = """
type="thing" blahblahblah
something id="123456"
...
type="disabled thing" blahblahblah
somethingelse id="123457"
...
"""
>>> q = re.compile(r'type="thing".*\n.*\n')
>>> q.findall(t)
['type="thing" blahblahblah\nsomething id="123456"\n']
>>> for s in q.findall(t):
print s
type="thing" blahblahblah
something id="123456"
如果您不使用re.S,则可以更有效地控制表达式的贪婪。您的.+
与re.S
相结合会使您的表达变得贪婪,否则您将不得不考虑。你也可以使用像.+?
这样的东西。加号后面的问号会使你的表达不贪婪,但我会选择更简洁的表达。
答案 1 :(得分:0)
使用此:
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