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!
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!
Câu trả lời:
import re
word = 'fubar'
regexp = re.compile(r'ba[rzd]')
if regexp.search(word):
print 'matched'
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_text
hay sử dụng re.compile(r'xyz').search(given_text)
?
[]
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.
Điều tốt nhất cho đến nay là
bool(re.search('ba[rzd]', 'foobarrrr'))
Trả về True
bool
. OP: "phải trả về True
nế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ữ )
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 search
chứ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 regexp
khô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 bar
than so khớp sẽ không hoạt động. Vì vậy, nó thích hợp hơn để sử dụng re.search
.
search
hơ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ỉ ...
.
st
thà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.
in
và là regex
gì?
Đâ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
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
bool(re.search('ba[rzd]', 'sometext'))
.