Python:用于在多行输入中排除字符串/单词的正则表达式
我在用Python 2.7.3的正则表达式处理带有换行符的大文本时遇到了一些问题。我有这样的内容:
type="thing" blahblahblah
something id="123456"
...
type="disabled thing" blahblahblah
somethingelse id="123457"
...
我想找出所有类型为"thing"的id。由于正则表达式的贪婪特性,我必须写一个这样的正则表达式:
r'type="thing"(?!type).+id="[0-9]{6,7}"', re.S
但是,这个方法不起作用。我该如何在这种输入数据上制作一个排除字符串的正则表达式呢?
2 个回答
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
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
结合在一起会让你的表达式变得贪婪,这样你就需要额外考虑这个问题。你也可以使用类似 .+?
的写法。加在加号后面的问号会让你的表达式变得不那么贪婪,但我建议使用更简洁的表达方式。