python's re: return True, jeśli łańcuch zawiera wzorzec wyrażenia regularnego


103

Mam takie wyrażenie regularne:

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

Funkcja musi zwrócić True, jeśli słowo zawiera bar , baz lub bad . Krótko mówiąc, potrzebuję analogi regexp dla języka Python

'any-string' in 'text'

Jak mogę to zrealizować? Dzięki!


17
Po prostu użyj bool(re.search('ba[rzd]', 'sometext')).
Raymond Hettinger

Odpowiedzi:


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

1
Pracuję nad podobnym przypadkiem, w którym chcę wyszukać dokładny ciąg ( xyz) i chcę wiedzieć, który jest bardziej skuteczny w tym celu, czy powinienem użyć języka Python, 'xyz' in given_textczy użyć re.compile(r'xyz').search(given_text)?
bawejakunal

1
te []wsporniki zawierają klasę postaci, dzięki czemu pasuje również re: >>> „ba |” słowa =; regexp.search (word) <_sre.SRE_Match object at 0x101030b28>. Możesz upuścić wszystkie symbole rur.
radtek

106

Zdecydowanie najlepszy jest

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

Zwraca True


2
Dlaczego to jest lepsze od innych rozwiązań?
kres0345

1
Po pierwsze, zwraca bool. OP: „musi zwrócić, Truejeśli słowo zawiera bar, baz lub bad”. Inne odpowiedzi wykorzystują zachowanie if- automatycznej konwersji wyrażenia na jego prawo do a bool. np. import re; rgx=re.compile(r'ba[rzd]'); rgx.search('foobar')=> <re.Match object; span=(2, 5), match='bar'>, ale if(rgx.search(w)): print('y')=> y. Najbliższa dokumentacja automatycznej konwersji, którą udało mi się znaleźć ( zarchiwizowane )
bballdave025

18

Matchobiekty są zawsze prawdziwe i Nonesą zwracane, jeśli nie ma dopasowania. Po prostu sprawdź poprawność.

Kod:

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

Wyjście = bar

Jeśli chcesz searchfunkcjonalności

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

a jeśli regexpnie zostanie znaleziony, to

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

Jak wspomniał @bukzor, jeśli st = foo barthan match nie zadziała. Tak więc jego użycie jest bardziej odpowiednie re.search.


1
Jak rozumiem pytanie, OP searchraczej chce niż match. (Zobacz docs.python.org/library/re.html#matching-vs-searching. ) Ponadto myślę, że byłoby pomocne, gdybyś pokazał rzeczywiste możliwe argumenty we właściwej kolejności, a nie tylko ....
ruakh

1
jeśli zmienisz stna "foo bar", metoda dopasowania nie będzie tutaj działać. Chcesz szukać.
bukzor

@ruakh, który link nie przewija się już automatycznie do tej części dokumentu, teraz link to docs.python.org/2/library/re.html#search-vs-match
freeforall tousez

@RanRag jaka jest różnica w złożoności wyszukiwania podciągów za pomocą ini regex?
Piyush S. Wanare

1

Oto funkcja, która robi to, co chcesz:

import re

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

Metoda wyszukiwania wyrażeń regularnych zwraca obiekt po pomyślnym zakończeniu i None, jeśli wzorzec nie zostanie znaleziony w ciągu. Mając to na uwadze, zwracamy wartość True, o ile wyszukiwanie zwraca nam coś.

Przykłady:

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

Możesz zrobić coś takiego:

Użycie wyszukiwania zwróci obiekt SRE_match, jeśli pasuje do szukanego ciągu.

>>> 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()

Jeśli nie, zwróci None

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

I tylko po to, aby go wydrukować i ponownie zademonstrować:

>>> print n
None
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.