python's re: return True jika string berisi pola regex


98

Saya memiliki ekspresi reguler seperti ini:

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

Fungsi harus mengembalikan True jika kata berisi bilah , baz , atau buruk . Singkatnya, saya membutuhkan analog regexp untuk Python

'any-string' in 'text'

Bagaimana saya bisa menyadarinya? Terima kasih!


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

Jawaban:


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

1
Saya sedang mengerjakan kasus serupa di mana saya ingin mencari string yang tepat ( xyz) dan ingin tahu cara mana yang lebih efisien untuk melakukan ini, haruskah saya menggunakan python 'xyz' in given_textatau menggunakan re.compile(r'xyz').search(given_text)?
bawejakunal

1
yang []kurung mengandung kelas karakter, sehingga kembali Anda juga cocok: >>> kata = 'ba |'; regexp.search (kata) <_sre.SRE_Match objek di 0x101030b28>. Anda dapat menjatuhkan semua simbol pipa.
radtek

104

Yang terbaik sejauh ini adalah

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

Mengembalikan True


2
Mengapa solusi ini lebih baik daripada solusi lainnya?
kres0345

1
Untuk satu hal, ini mengembalikan a bool. OP: "harus dikembalikan Truejika kata mengandung bar, baz atau bad." Jawaban lain menggunakan perilaku if- mengubah ekspresi secara otomatis ke kanan menjadi a bool. misalnya import re; rgx=re.compile(r'ba[rzd]'); rgx.search('foobar')=> <re.Match object; span=(2, 5), match='bar'>, tetapi if(rgx.search(w)): print('y')=> y. Paling dekat dengan dokumentasi konversi otomatis yang dapat saya temukan ( diarsipkan )
bballdave025

15

Matchobjek selalu benar, dan Nonedikembalikan jika tidak ada kecocokan. Uji saja kebenarannya.

Kode:

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

Keluaran = bar

Jika Anda menginginkan searchfungsionalitas

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

dan jika regexptidak ditemukan dari

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

Seperti yang disebutkan @bukzor jika st = foo barthan match tidak akan berfungsi. Jadi, lebih tepat digunakan re.search.


1
Seperti yang saya mengerti pertanyaannya, OP sebenarnya menginginkan searchdaripada match. (Lihat docs.python.org/library/re.html#matching-vs-searching. ) Selain itu, menurut saya akan membantu jika Anda menunjukkan kemungkinan argumen yang sebenarnya, dalam urutan yang benar, bukan hanya ....
ruakh

1
jika Anda mengubah stke "foo bar", metode pencocokan tidak akan berfungsi di sini. Anda ingin mencari.
bukzor

@ruakh tautan itu tidak lagi menggulir otomatis ke bagian dokumen itu, sekarang tautannya adalah docs.python.org/2/library/re.html#search-vs-match
freeforall tousez

@RanRag apa perbedaan kompleksitas dalam mencari substring dengan indan regex?
Piyush S. Wanare

1

Inilah fungsi yang melakukan apa yang Anda inginkan:

import re

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

Metode pencarian ekspresi reguler mengembalikan objek pada keberhasilan dan Tidak ada jika pola tidak ditemukan dalam string. Dengan pemikiran tersebut, kami mengembalikan True selama pencarian memberikan sesuatu kepada kami.

Contoh:

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

Anda bisa melakukan sesuatu seperti ini:

Menggunakan pencarian akan mengembalikan objek SRE_match, jika cocok dengan string pencarian Anda.

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

Jika tidak, itu akan mengembalikan Tidak Ada

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

Dan hanya untuk mencetaknya untuk mendemonstrasikan lagi:

>>> print n
None
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.