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.
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 isnotNone:
... 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.
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ć.
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ś.
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ć:
bool(re.search('ba[rzd]', 'sometext'))
.Odpowiedzi:
import re word = 'fubar' regexp = re.compile(r'ba[rzd]') if regexp.search(word): print 'matched'
źródło
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
źródło
bool
. OP: „musi zwrócić,True
jeśli słowo zawiera bar, baz lub bad”. Inne odpowiedzi wykorzystują zachowanieif
- automatycznej konwersji wyrażenia na jego prawo do abool
. np.import re; rgx=re.compile(r'ba[rzd]'); rgx.search('foobar')
=><re.Match object; span=(2, 5), match='bar'>
, aleif(rgx.search(w)): print('y')
=>y
. Najbliższa dokumentacja automatycznej konwersji, którą udało mi się znaleźć ( zarchiwizowane )Match
obiekty są zawsze prawdziwe iNone
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 odpowiedniere.search
.źródło
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
iregex
?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
źródło
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
źródło