python's re: return True, якщо рядок містить шаблон регулярного виразу


98

У мене є такий регулярний вираз:

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

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

'any-string' in 'text'

Як я можу це усвідомити? Дякую!


17
Просто використовуйте bool(re.search('ba[rzd]', 'sometext')).
Реймонд Хеттінгер,

Відповіді:


154
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 (слово) <_sre.SRE_Match об'єкт в 0x101030b28>. Ви можете скинути всі символи труби.
radtek

104

Найкращий на сьогоднішній день

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

Повертає True


2
Чому це одне краще, ніж інші рішення?
kres0345

1
З одного боку, він повертає a bool. OP: "повинен повернутись, Trueякщо слово містить штрих, баз або погано." Інші відповіді використовують поведінку 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. Найближчий до документації
автоконвертації, який

15

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. ) Крім того, я думаю, було б корисно, якщо б ви показали фактичні можливі аргументи у правильному порядку, а не просто ....
ruahh

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.