python's re: возвращает True, если регулярное выражение содержит в строке


у меня есть регулярное выражение вроде этого:

regexp = u'ba[r|z|d]'

функция должна возвращать True, если word содержит бар,баз или плохо. Короче говоря, мне нужен аналог regexp для Python

'any-string' in 'text'

Как я могу реализовать это? Спасибо!

5 56

5 ответов:

import re
word = 'fubar'
regexp = re.compile(r'ba[rzd]')
if regexp.search(word):
  print 'matched'

лучший на сегодняшний день составляет

bool(re.search('ba[rzd]', 'foobarrrr'))

Возвращает True

Match объекты всегда истинны, и None возвращается, если нет совпадений. Просто проверь на правдивость.

код:

>>> st = 'bar'
>>> m = re.match(r"ba[r|z|d]",st)
>>> if m:
...     m.group(0)
...
'bar'

выход = bar

если вы хотите search функциональность

>>> st = "bar"
>>> m = re.search(r"ba[r|z|d]",st)
>>> if m is not None:
...     m.group(0)
...
'bar'

и если regexp не нашел, чем

>>> st = "hello"
>>> m = re.search(r"ba[r|z|d]",st)
>>> if m:
...     m.group(0)
... else:
...   print "no match"
...
no match

как упоминал @bukzor, если st = foo bar чем матч не получится. Таким образом, его более целесообразно использовать re.search.

вы можете сделать что-то вроде этого:

использование поиска вернет объект SRE_match, если он соответствует вашей строке поиска.

>>> import re
>>> m = re.search(u'ba[r|z|d]', 'bar')
>>> m
<_sre.SRE_Match object at 0x02027288>
>>> m.group()
'bar'
>>> n = re.search(u'ba[r|z|d]', 'bas')
>>> n.group()

Если нет, то он не вернет None

Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module>
    n.group()
AttributeError: 'NoneType' object has no attribute 'group'

и просто распечатать его вновь продемонстрировать:

>>> print n
None

вот функция, которая делает то, что вы хотите:

import re

def is_match(regex, text):
    pattern = re.compile(regex, text)
    return pattern.search(text) is not None

метод поиска регулярных выражений возвращает объект при успешном выполнении и нет, если шаблон не найден в строке. Имея это в виду, мы вернемся, пока поиск дает что-то взамен.

примеры:

>>> is_match('ba[rzd]', 'foobar')
True
>>> is_match('ba[zrd]', 'foobaz')
True
>>> is_match('ba[zrd]', 'foobad')
True
>>> is_match('ba[zrd]', 'foobam')
False