python re:多个正则表达式

时间:2012-02-08 09:07:48

标签: python regex string

我开始学习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 个答案:

答案 0 :(得分: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 in this question给出了一个很好的解释。

答案 1 :(得分: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's re module docs

答案 2 :(得分:1)

我建议使用期待检查你内部没有</tag>

re.findall(r'<tag>((?:(?!</tag>).)*?cheese(?:(?!</tag>).)*?)</tag>', cheesetext)