Python的re:多个正则表达式
我开始学习 re
模块。首先,我会展示原始代码:
import re
cheesetext = u'''<tag>I love cheese.</tag>
<tag>Yeah, cheese is all I need.</tag>
<tag>But let me explain one thing.</tag>
<tag>Cheese is REALLY I need.</tag>
<tag>And the last thing I'd like to say...</tag>
<tag>Everyone can like cheese.</tag>
<tag>It's a question of the time, I think.</tag>'''
def action1(source):
regex = u'<tag>(.*?)</tag>'
pattern = re.compile(regex, re.UNICODE | re.DOTALL | re.IGNORECASE)
result = pattern.findall(source)
return(result)
def action2(match, source):
pattern = re.compile(match, re.UNICODE | re.DOTALL | re.IGNORECASE)
result = bool(pattern.findall(source))
return(result)
result = action1(cheesetext)
result = [item for item in result if action2(u'cheese', item)]
print result
>>> [u'I love cheese.', u'Yeah, cheese is all I need.', u'Cheese is REALLY I need.', u'Everyone can like cheese.']
现在我需要做的事情是,我想用一个正则表达式来完成同样的工作。这只是一个例子,我需要处理的信息比这些简单的文本要多得多。:-) 有没有办法把这两个操作合并成一个正则表达式呢?所以我的问题是:我该如何在正则表达式中使用条件?
3 个回答
1
你可以使用 |
。
>>> import re
>>> m = re.compile("(Hello|Goodbye) World")
>>> m.match("Hello World")
<_sre.SRE_Match object at 0x01ECF960>
>>> m.match("Goodbye World")
<_sre.SRE_Match object at 0x01ECF9E0>
>>> m.match("foobar")
>>> m.match("Hello World").groups()
('Hello',)
另外,如果你需要真正的条件判断,可以使用一些条件语句来处理之前匹配到的组,比如 (?=...)
、(?!...)
、(?P=name)
这些。具体可以参考 Python的re模块文档。
1
我建议使用前瞻(look forward)来检查你里面没有出现 </tag>
这个标签。
re.findall(r'<tag>((?:(?!</tag>).)*?cheese(?:(?!</tag>).)*?)</tag>', cheesetext)
2
>>> p = u'<tag>((?:(?!</tag>).)*cheese.*?)</tag>'
>>> patt = re.compile(p, re.UNICODE | re.DOTALL | re.IGNORECASE)
>>> patt.findall(cheesetext)
[u'I love cheese.', u'Yeah, cheese is all I need.', u'Cheese is REALLY I need.', u'Everyone can like cheese.']
这段话提到了一个叫做“负向前瞻”的概念。Tim Pietzcker在这个问题中对它做了很好的解释。