python'un re: return True eğer dize düzenli ifade kalıbı içeriyorsa


107

Bunun gibi düzenli bir ifadem var:

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

Sözcük bar , baz veya kötü içeriyorsa işlev True döndürmelidir . Kısacası, Python'un

'any-string' in 'text'

Bunu nasıl anlayabilirim? Teşekkürler!


17
Sadece kullan bool(re.search('ba[rzd]', 'sometext')).
Raymond Hettinger

Yanıtlar:


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

1
Tam bir dizeyi ( xyz) aramak istediğim ve bunu yapmanın daha etkili bir yolunun hangisi olduğunu bilmek istediğim benzer bir durum üzerinde çalışıyorum, python'u 'xyz' in given_textkullanmalı re.compile(r'xyz').search(given_text)mıyım yoksa kullanmalı mıyım?
bawejakunal

1
[]re de eşleşecek şekilde parantez, bir karakter sınıfını içerir: >>> kelime = 'ba |'; regexp.search (word) <_sre.SRE_Match nesnesi 0x101030b28>. Tüm boru sembollerini bırakabilirsiniz.
radtek

108

Şimdiye kadar en iyisi

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

True döndürür


2
Bu neden diğer çözümlerden daha iyi?
kres0345

1
Birincisi, a döndürür bool. OP: " Truekelime bar, baz veya kötü içeriyorsa dönmelidir ." Diğer yanıtlar şu davranışı kullanır if- ifadeyi otomatik olarak sağa çevirerek a bool. örneğin import re; rgx=re.compile(r'ba[rzd]'); rgx.search('foobar')=> <re.Match object; span=(2, 5), match='bar'>, ama if(rgx.search(w)): print('y')=> y.
Bulabildiğim

20

Matchnesneler her zaman doğrudur ve Noneeşleşme yoksa döndürülür. Sadece doğruluğu test edin.

Kod:

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

Çıktı = bar

searchİşlevsellik istiyorsanız

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

ve eğer regexpbulunmazsa

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

@Bukzor'un belirttiği gibi, eğer st = foo barthan match çalışmazsa. Bu yüzden kullanımı daha uygun re.search.


1
Soruyu anladığım kadarıyla, OP aslında searchdaha çok istiyor match. (Bkz. Docs.python.org/library/re.html#matching-vs-searching. ) Ayrıca, gerçek olası argümanları sadece yerine doğru sırada göstermenizin faydalı olacağını düşünüyorum ....
ruakh

1
Eğer değiştirirseniz stiçin "foo bar", maç yöntemi burada çalışmaz. Aramak istiyorsun.
bukzor

@ruakh bu bağlantı artık dokümanın o kısmına otomatik olarak kaydırılmıyor, artık bağlantı docs.python.org/2/library/re.html#search-vs-match
freeforall tousez

@RanRag inve ile alt dizeyi aramadaki karmaşıklık farkı regexnedir?
Piyush S. Wanare

1

İşte istediğinizi yapan bir işlev:

import re

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

Normal ifade arama yöntemi, başarılı olduğunda bir nesne ve dizede bulunamazsa Yok döndürür. Bunu akılda tutarak, arama bize bir şey verdiği sürece True döndürüyoruz.

Örnekler:

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

Bunun gibi bir şey yapabilirsiniz:

Aramayı kullanmak, arama dizenizle eşleşirse bir SRE_match nesnesi döndürür.

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

Değilse, Hiçbiri döndürür

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

Ve tekrar göstermek için yazdırmak için:

>>> print n
None
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.