Các anwser tự
regex = '|'.join([r'\b' + str(state) + r'\b' for state in states])
Lý do đằng sau này là các Tiền tố 'r' yêu cầu Python không phân tích chuỗi mà bạn truyền cho nó. Nếu bạn không đặt 'r' trước chuỗi, Python sẽ cố gắng biến bất kỳ từ trước nào bằng '\' thành một char đặc biệt, để cho phép bạn nhập các dòng ngắt (\ n), các tab (\ t) và như vậy dễ dàng.
Khi bạn làm '\b'
, bạn yêu cầu Python tạo chuỗi, phân tích và biến '\ b' thành 'backspace', trong khi bạn làm r'\b'
, Python chỉ lưu '\' rồi 'b' và điều này là những gì bạn muốn với regex. Luôn sử dụng 'r' cho chuỗi được sử dụng làm mẫu regex.
Ký hiệu 'r' được gọi là 'chuỗi thô', nhưng điều đó gây hiểu lầm, vì không có chuỗi nào như chuỗi thô trong nội bộ Python. Chỉ cần nghĩ về nó như một cách để nói với Python để tránh bị quá thông minh.
Có một ký hiệu khác trong Python < 3.0, u'string
', điều đó sẽ yêu cầu Python lưu trữ chuỗi dưới dạng unicode. Bạn có thể kết hợp cả hai: ur"é\n"
sẽ lưu trữ "\ bé" làm unicode, trong khi u"é\n"
sẽ lưu trữ "é" rồi ngắt dòng.
Một số cách để cải thiện mã của bạn:
regex = '|'.join(r'\b' + str(state) + r'\b' for state in states)
Loại bỏ các phụ []
. Nó nói với Python không lưu trữ trong bộ nhớ danh sách các giá trị mà bạn đang tạo ra. Chúng tôi có thể làm điều đó ở đây vì chúng tôi không có kế hoạch sử dụng lại danh sách bạn đang tạo vì bạn sử dụng trực tiếp trong số join()
và không có nơi nào khác.
regex = '|'.join(r'\b%s\b' % state for state in states)
Điều này sẽ tự động chuyển đổi chuỗi và ngắn hơn và sạch hơn.Khi bạn định dạng chuỗi bằng Python, hãy nghĩ về số % operator.
Nếu các trạng thái chứa danh sách mã zip của tiểu bang, thì phải lưu trữ dưới dạng chuỗi, chứ không phải là int. Trong trường hợp đó, bạn có thể bỏ qua loại truyền và rút ngắn hơn nữa:
regex = r'\b%s\b' % r'\b|\b'.join(states)
Cuối cùng, bạn có thể không cần regex chút nào. Nếu tất cả các bạn quan tâm là để kiểm tra xem một trong những zip code là trong chuỗi nhất định, bạn chỉ có thể sử dụng in
(kiểm tra nếu một mục là trong một iterable, như thế nào nếu một chuỗi là trong danh sách):
matches = [s for s in states if s in 'grand rapids, mi 49505']
Từ cuối
Tôi hiểu bạn có thể thất vọng khi học một ngôn ngữ mới, nhưng dành thời gian để đưa ra một tiêu đề phù hợp cho câu hỏi của bạn. Trong trang web này, tiêu đề phải kết thúc bằng dấu chấm hỏi và cung cấp chi tiết cụ thể về sự cố.
Lưu ý: Các dấu ngoặc vuông là dư thừa (trên thực tế, có hại: sự khác biệt giữa 'O (n)' và 'O (1)' bộ nhớ tiêu thụ), thay vào đó, sử dụng một [biểu thức máy phát điện] (http://docs.python.org/tutorial/classes.html#generator-expressions). – delnan