2010-08-30 29 views
8

tôi phải kiểm tra rất nhiều thế giới nếu họ đang có trong chuỗi ... mã trông giống như:Làm thế nào để làm cho nó ngắn hơn (Pythonic)?

if "string_1" in var_string or "string_2" in var_string or "string_3" in var_string or "string_n" in var_string: 
    do_something() 

làm thế nào để làm cho nó dễ đọc hơn và rõ ràng hơn?

+0

biểu thức chính quy này, (nhưng không nhớ làm thế nào để làm điều đó trong python) – pastjean

Trả lời

35

Đây là một cách:

words = ['string_1', 'string_2', ...] 

if any(word in var_string for word in words): 
    do_something() 

tham khảo: any()

Cập nhật:

Để hoàn chỉnh, nếu bạn muốn thực hiện chức năng chỉ khi tất cả lời được chứa trong chuỗi, bạn có thể sử dụng all() thay vì any(). Cũng lưu ý rằng cấu trúc này sẽ không thực hiện bất kỳ phép tính không cần thiết nào như any sẽ trả lại nếu nó gặp một giá trị truegenerator expression được sử dụng để tạo các giá trị Boolean. Vì vậy, bạn cũng có một số loại short-circuit evaluation thường được sử dụng khi đánh giá biểu thức Boolean.

+0

Cảm ơn đó là những gì tôi cần ... – Pol

+0

@ Pol: Bạn nên đánh dấu điều này là được chấp nhận, sau đó. –

1

Bạn đã xem bộ lọc chưa?

filter(lambda x: x in var_string, ["myString", "nextString"]) 

mà sau đó có thể được kết hợp với bản đồ để có được điều này

map(doSomething(), filter(lambda x: x in var_string, ["myString", "nextString"])) 

EDIT:

tất nhiên điều đó không làm những gì bạn muốn. Đi với giải pháp any. Vì lý do nào đó, tôi nghĩ bạn muốn nó được thực hiện mỗi lần thay vì chỉ một lần.

+0

Sẽ không thực hiện 'doSomething()' cho bất kỳ từ nào có trong chuỗi? –

+0

Có. Oh chờ đợi, anh chỉ muốn được thực hiện một lần, không? Crap. Cảm ơn bạn đã chỉ ra điều đó. – wheaties

0
>>> import re 
>>> string="word1testword2andword3last" 
>>> c=re.compile("word1|word2|word3") 
>>> c.search(string) 
<_sre.SRE_Match object at 0xb7715d40> 
>>> string="blahblah" 
>>> c.search(string) 
>>> 
+0

điều này xuất hiện ít ngắn gọn và ít pythonic cho mắt trăn của tôi – marr75

+5

Xác định Pythonic? Điều gì làm cho một cái gì đó Pythonic? Tuyên bố ngắn gọn duy nhất ở trên là re.compile và re.search. Phần còn lại chỉ hiển thị các ví dụ đầu ra. Oh chờ đợi, lời nhắc thông dịch Python có thể làm mờ mắt Pythonic của bạn ... – ghostdog74

2
import re 
if re.search("string_1|string_2|string_n", var_strings): print True 

Vẻ đẹp của python regex nó mà nó trả về hoặc là một đối tượng regex (cung cấp cho thông tin về những gì phù hợp) hoặc Không, mà có thể được sử dụng như một giá trị "false" trong một thử nghiệm.

2

Với regex đó sẽ là:

import re 
words = ['string_1', 'string_2', ...] 

if re.search('|'.join([re.escape(w) for w in words]), var_string): 
    blahblah 
+0

Tôi gần như đã upvoted vì nó sáng tạo và Felix Kling đã có rất nhiều upvotes;) Nhưng nó sẽ thất bại nếu bất kỳ chuỗi nào chứa các siêu ký tự regex. – delnan

+0

Và đó là lý do tại sao có re.escape .... – ondra

0

thêm một cách để đạt được check = lambda a: any(y for y in ['string_%s'%x for x in xrange(0,10)] if y in a)

print check('hello string_1')

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