python';s re:多正则表达式

python';s re:多正则表达式,python,regex,string,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>

我开始学习
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.']
重新导入
我喜欢奶酪。
是的,我只需要奶酪。
但让我解释一件事。
奶酪是我真正需要的。
我最不想说的是。。。
每个人都喜欢奶酪。
我想这是个时间问题。”
def action1(来源):
regex=u'(*?)
pattern=re.compile(regex,re.UNICODE | re.DOTALL | re.IGNORECASE)
结果=pattern.findall(源)
返回(结果)
def操作2(匹配,来源):
pattern=re.compile(匹配,re.UNICODE | re.DOTALL | re.IGNORECASE)
结果=bool(模式.findall(源))
返回(结果)
结果=操作1(cheesetext)
结果=[如果操作2(u'cheese',项目)结果中项目的项目]
打印结果
>>>[你'我喜欢奶酪',你'是的,奶酪是我所需要的一切',你'奶酪是我真正需要的',你'每个人都可以喜欢奶酪']

现在我需要什么。我需要用一个正则表达式做同样的事情。这是一个例子,我必须处理比这些俗气的文本多得多的信息。:-)是否可以将这两个操作合并到一个正则表达式中?所以问题是:我如何使用regex中的条件?

您可以使用

>>> 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',)
>>重新导入
>>>m=re.compile(“(你好|再见)世界”)
>>>m.match(“你好,世界”)
>>>m.match(“再见世界”)
>>>m.match(“foobar”)
>>>m.match(“你好世界”).groups()
(‘你好’,)

此外,如果您需要实际条件,可以对以前匹配的组使用条件,这些组包括
(?=…)
(?!…)
(?p=name)
和朋友。请参阅。

您可以使用
|

>>> 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',)
>>重新导入
>>>m=re.compile(“(你好|再见)世界”)
>>>m.match(“你好,世界”)
>>>m.match(“再见世界”)
>>>m.match(“foobar”)
>>>m.match(“你好世界”).groups()
(‘你好’,)

此外,如果您需要实际条件,可以对以前匹配的组使用条件,这些组包括
(?=…)
(?!…)
(?p=name)
和朋友。请参阅。

我建议使用“向前看”来检查内部是否有

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

我建议使用“向前看”来检查您的车内是否有

re.findall(r'<tag>((?:(?!</tag>).)*?cheese(?:(?!</tag>).)*?)</tag>', cheesetext)
re.findall(r'((?:(?!))*?奶酪(?(?!))*?),奶酪文本)
>>p=u'((?:(?!))*奶酪。*?'
>>>patt=re.compile(p,re.UNICODE | re.DOTALL | re.IGNORECASE)
>>>帕特·芬德尔(奶酪文本)
[你'我喜欢奶酪',你'是的,奶酪是我所需要的一切',你'奶酪是我真正需要的',你'每个人都可以喜欢奶酪']
这使用了一个否定的前瞻断言。Tim Pietzcker对此给出了一个很好的解释。

>>p=u'((?:(?!)*cheese.*?)
>>>patt=re.compile(p,re.UNICODE | re.DOTALL | re.IGNORECASE)
>>>帕特·芬德尔(奶酪文本)
[你'我喜欢奶酪',你'是的,奶酪是我所需要的一切',你'奶酪是我真正需要的',你'每个人都可以喜欢奶酪']

这使用了一个否定的前瞻断言。Tim Pietzcker对此给出了一个很好的解释。

顺便说一句,您似乎正在尝试使用正则表达式解析SGML/HTML/XML。这并不总是最好的方法,正则表达式将所有内容都视为一个平面字符串,而标记语言则描述一棵树。无论您做什么,都不要尝试使用正则表达式来转义HTML,或者。顺便说一下,您似乎正在尝试使用正则表达式解析SGML/HTML/XML。这并不总是最好的方法,正则表达式将所有内容都视为一个平面字符串,而标记语言则描述一棵树。无论你做什么,都不要试图用正则表达式来转义HTML,或者。你需要对“奶酪”的两面都进行负面展望。为什么?你已经在使用一个不情愿的
*?
,所以比赛将在
停止。哈,没问题。我敢肯定你的版本也能用,它只是做了一些不必要的计算。@beerbajay:谢谢,谢谢,这是最好的答案!一个问题。我可以在这里再加上两个条件吗:如果“奶酪”不是“BARcheeseFOO”或“FOOcheeseBAR”的一部分,单词将出现在列表中?我不明白我必须在哪里插入条件。条件越多,正则表达式就越难读取。您可以有这些条件,但分几个步骤进行分析几乎更容易。还有,这个例子呢:
我喜欢奶酪,但讨厌BARcheeseFOO
?你需要对“奶酪”的两面都采取消极的态度,为什么?你已经在使用一个不情愿的
*?
,所以比赛将在
停止。哈,没问题。我敢肯定你的版本也能用,它只是做了一些不必要的计算。@beerbajay:谢谢,谢谢,这是最好的答案!一个问题。我可以在这里再加上两个条件吗:如果“奶酪”不是“BARcheeseFOO”或“FOOcheeseBAR”的一部分,单词将出现在列表中?我不明白我必须在哪里插入条件。条件越多,正则表达式就越难读取。您可以有这些条件,但分几个步骤进行分析几乎更容易。还有,这个例子呢:
我喜欢奶酪,但讨厌BARcheeseFOO