0

我在尝试使用 Python 2.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

但是,这不起作用。如何在输入时使用这种数据制作排除字符串正则表达式?

4

2 回答 2

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会使你的表达变得贪婪,否则你将不得不考虑这一点。您也可以使用类似.+?. 加号后面的问号会让你的表达不贪心,但我会选择更简洁的表达方式。

于 2013-01-16T13:38:32.003 回答
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
于 2013-01-16T13:44:44.020 回答