re в Python: множественное регулярное выражение - PullRequest
0 голосов
/ 08 февраля 2012

Я начинаю учить 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 ]

2 голосов
/ 08 февраля 2012
>>> 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.']

При этом используется отрицательное утверждение. Хорошее объяснение этому дает Тим ​​Пицкер в этом вопросе .

1 голос
/ 08 февраля 2012

Я предлагаю использовать look foward, чтобы убедиться, что вы не получили </tag> внутри

re.findall(r'<tag>((?:(?!</tag>).)*?cheese(?:(?!</tag>).)*?)</tag>', cheesetext)
1 голос
/ 08 февраля 2012

Вы можете использовать |.

>>> 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...