2012-01-25 38 views
49

Tôi có một biểu hiện thường xuyên như thế này:python của: return True nếu regex chứa trong chuỗi

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

Chức năng phải trả lại True nếu từ chứa thanh, baz hoặc xấu. 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? Cảm ơn!

+10

Chỉ cần sử dụng '' bool (re.search ('ba [RZD]', 'sometext ')) ''. –

Trả lời

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

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

+1

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

10

Match đố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 sự thật.

Code:

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

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

Khi tôi hiểu câu hỏi, OP thực sự muốn 'tìm kiếm' thay vì' so khớp'. (Xem http://docs.python.org/library/re.html#matching-vs-searching.Ngoài ra, tôi nghĩ rằng sẽ rất hữu ích nếu bạn cho thấy các đối số thực tế có thể, theo đúng thứ tự, thay vì chỉ '...'. – ruakh

+1

nếu bạn thay đổi '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. – bukzor

+0

@bukzor: bạn đúng Tôi đã bỏ lỡ phần đó. – RanRag

0

Bạn có thể làm một cái gì đó như thế này:

Sử dụng tìm kiếm sẽ trả về một đối tượng SRE_match, nếu nó phù hợ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ở lại Không

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

Và chỉ để in nó để chứng minh một lần nữa:

>>> print n 
None 
0

Dưới đây là một chức năng mà 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 thành công và None nếu mẫu không được tìm thấy trong chuỗi. Với ý nghĩ đó, chúng tôi trả về True miễn là tìm kiếm cung cấp cho chúng tôi một cái gì đó trở lại.

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 
50

Một tốt nhất cho đến nay là

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

trả về true

+1

nó là tốt nhất. – shaashwato

Các vấn đề liên quan