python re: return True, если строка содержит шаблон регулярного выражения


104

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

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

Функция должна возвращать True, если слово содержит bar , baz или bad . Короче, мне нужен аналог regexp для Python

'any-string' in 'text'

Как я могу это реализовать? Благодарность!


17
Просто используйте bool(re.search('ba[rzd]', 'sometext')).
Raymond Hettinger

Ответы:


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

1
Я работаю над аналогичным случаем, когда я хочу найти точную строку ( xyz) и хочу знать, какой способ сделать это более эффективно, следует ли мне использовать python 'xyz' in given_textили использовать re.compile(r'xyz').search(given_text)?
bawejakunal

1
в []скобках класса символов, так что ваш ре также соответствует: >>> «ба |» слова =; regexp.search (word) <объект _sre.SRE_Match в 0x101030b28>. Вы можете отбросить все символы трубы.
radtek

106

На сегодняшний день лучший из них

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

Возвращает True


2
Почему это лучше, чем другие решения?
kres0345

1
Во-первых, он возвращает bool. OP: "должен возвращаться, Trueесли слово содержит bar, baz или bad". В других ответах используется поведение if- автоматическое преобразование выражения вправо в a bool. например import re; rgx=re.compile(r'ba[rzd]'); rgx.search('foobar')=> <re.Match object; span=(2, 5), match='bar'>, но if(rgx.search(w)): print('y')=> y. Ближе всего к документации по
автоконвертированию, которую

18

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 barthan match не будет работать. Так что его более целесообразно использовать re.search.


1
Насколько я понимаю вопрос, OP действительно хочет, searchа не match. (См. Docs.python.org/library/re.html#matching-vs-searching. ) Кроме того, я думаю, было бы полезно, если бы вы показали реальные возможные аргументы в правильном порядке, а не просто ....
ruakh

1
если вы измените stна "foo bar", метод сопоставления здесь работать не будет. Вы хотите поискать.
bukzor

@ruakh, эта ссылка больше не автоматически прокручивается до этой части документа, теперь ссылка docs.python.org/2/library/re.html#search-vs-match
freeforall tousez

@RanRag в чем разница в сложности поиска подстроки с помощью inи regex?
Пиюш С. Ванаре

1

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

import re

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

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

Примеры:

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

0

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

Использование поиска вернет объект 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.