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

0 投票
2 回答
639 浏览
提问于 2025-04-17 13:14

我在用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 结合在一起会让你的表达式变得贪婪,这样你就需要额外考虑这个问题。你也可以使用类似 .+? 的写法。加在加号后面的问号会让你的表达式变得不那么贪婪,但我建议使用更简洁的表达方式。

撰写回答