Python:在多行输入中排除字符串/单词的正则表达式

时间:2013-01-16 13:31:48

标签: python regex

尝试使用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

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

2 个答案:

答案 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