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!
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!
Odpowiedzi:
import re
word = 'fubar'
regexp = re.compile(r'ba[rzd]')
if regexp.search(word):
print 'matched'
xyz
) i chcę wiedzieć, który jest bardziej skuteczny w tym celu, czy powinienem użyć języka Python, 'xyz' in given_text
czy użyć re.compile(r'xyz').search(given_text)
?
[]
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.
Zdecydowanie najlepszy jest
bool(re.search('ba[rzd]', 'foobarrrr'))
Zwraca True
bool
. OP: „musi zwrócić, True
jeś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 )
Match
obiekty są zawsze prawdziwe i None
są 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 search
funkcjonalności
>>> st = "bar"
>>> m = re.search(r"ba[r|z|d]",st)
>>> if m is not None:
... m.group(0)
...
'bar'
a jeśli regexp
nie 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 bar
than match nie zadziała. Tak więc jego użycie jest bardziej odpowiednie re.search
.
search
raczej 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 ...
.
st
na "foo bar"
, metoda dopasowania nie będzie tutaj działać. Chcesz szukać.
in
i regex
?
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
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
bool(re.search('ba[rzd]', 'sometext'))
.