python's re: return True nếu chuỗi chứa mẫu regex


97

Tôi có một biểu thức chính quy như sau:

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

Hàm phải trả về True nếu từ chứa bar , baz hoặc bad . Tóm lại, tôi cần tương tự regexp cho Python

'any-string' in 'text'

Làm thế nào tôi có thể nhận ra nó? Cảm ơn!


17
Chỉ cần sử dụng bool(re.search('ba[rzd]', 'sometext')).
Raymond Hettinger

Câu trả lời:


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

1
Tôi đang giải quyết một trường hợp tương tự trong đó tôi muốn tìm kiếm một chuỗi chính xác ( xyz) và muốn biết cách nào hiệu quả hơn để thực hiện việc này, tôi nên sử dụng python 'xyz' in given_texthay sử dụng re.compile(r'xyz').search(given_text)?
bawejakunal

1
các []dấu ngoặc chứa một lớp ký tự, vì vậy re của bạn cũng khớp: >>> word = 'ba |'; regexp.search (word) <_sre.SRE_Match đối tượng tại 0x101030b28>. Bạn có thể bỏ tất cả các ký hiệu đường ống.
radtek

104

Điều tốt nhất cho đến nay là

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

Trả về True


2
Tại sao giải pháp này tốt hơn các giải pháp khác?
kres0345

1
Đối với một điều, nó trả về a bool. OP: "phải trả về Truenếu từ chứa thanh, baz hoặc xấu." Các câu trả lời khác sử dụng hành vi if- tự động chuyển đổi biểu thức sang quyền của nó thành a bool. ví dụ import re; rgx=re.compile(r'ba[rzd]'); rgx.search('foobar')=> <re.Match object; span=(2, 5), match='bar'>, nhưng if(rgx.search(w)): print('y')=> y. Gần nhất với tài liệu về tự động chuyển đổi mà tôi có thể tìm thấy (đã lưu trữ )
bballdave025

15

Match các đối tượng luôn đúng, và None được trả về nếu không có kết quả phù hợp. Chỉ cần kiểm tra tính đúng đắn.

Mã:

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

Đầu ra = bar

Nếu bạn muốn searchchức năng

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

và nếu regexpkhông tìm thấy hơn

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

Như @bukzor đã đề cập nếu st = foo barthan so khớp sẽ không hoạt động. Vì vậy, nó thích hợp hơn để sử dụng re.search.


1
Như tôi hiểu câu hỏi, OP thực sự muốn searchhơn là match. (Xem docs.python.org/library/re.html#matching-vs-searching. ) Ngoài ra, tôi nghĩ sẽ hữu ích nếu bạn hiển thị các đối số có thể thực tế, theo đúng thứ tự thay vì chỉ ....
ruakh

1
nếu bạn thay đổi stthành "foo bar", phương thức đối sánh sẽ không hoạt động ở đây. Bạn muốn tìm kiếm.
bukzor

@ruakh liên kết không còn tự động di chuyển đến một phần của doc, bây giờ liên kết là docs.python.org/2/library/re.html#search-vs-match
freeforall tousez

@RanRag sự khác biệt về độ phức tạp khi tìm kiếm chuỗi con với invà là regexgì?
Piyush S. Wanare

1

Đây là một chức năng thực hiện những gì bạn muốn:

import re

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

Phương thức tìm kiếm biểu thức chính quy trả về một đối tượng khi thành công và Không có nếu mẫu không được tìm thấy trong chuỗi. Với suy nghĩ đó, chúng tôi trả về True miễn là tìm kiếm trả lại cho chúng tôi điều gì đó.

Ví dụ:

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

Bạn có thể làm điều gì đó như sau:

Sử dụng tìm kiếm sẽ trả về một đối tượng SRE_match, nếu nó khớp với chuỗi tìm kiếm của bạn.

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

Nếu không, nó sẽ trả về Không có

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

Và chỉ cần in nó để chứng minh lại:

>>> print n
None
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.