2012-05-13 86 views
11

tôi đang có một chuỗi python định dạngtìm vị trí của một chuỗi con trong một chuỗi

mystr = "hi.this(is?my*string+" 

đây tôi cần phải có được vị trí của 'là' được bao quanh bởi ký tự đặc biệt hoặc các ký tự không thuộc chữ cái (ví dụ: thứ hai 'là' trong ví dụ này). tuy nhiên, sử dụng

mystr.find('is') 

sẽ trả lại vị trí nếu 'là' được liên kết với 'this' không mong muốn. làm thế nào tôi có thể tìm thấy vị trí của một chuỗi con được bao quanh bởi các ký tự không phải chữ cái trong một chuỗi? sử dụng python 2.7

Trả lời

13

Ở đây, tùy chọn tốt nhất là sử dụng cụm từ thông dụng. Python có the re module để làm việc với cụm từ thông dụng.

Chúng tôi sử dụng một tìm kiếm đơn giản để tìm ra vị trí của "is":

>>> match = re.search(r"[^a-zA-Z](is)[^a-zA-Z]", mystr) 

này trả về trận đấu đầu tiên như một đối tượng phù hợp. Sau đó chúng tôi chỉ đơn giản là sử dụng MatchObject.start() để có được vị trí bắt đầu:

>>> match.start(1) 
8 

Edit: Một điểm tốt thực hiện, chúng ta thực hiện "is" một nhóm và kết hợp nhóm để đảm bảo chúng tôi có được vị trí chính xác.

Như đã nêu trong các nhận xét, điều này tạo ra một vài giả định. Một là được bao quanh có nghĩa là "is" không thể ở đầu hoặc cuối của chuỗi, nếu đúng như vậy, cần có một biểu thức chính quy khác vì nó chỉ khớp với các chuỗi được bao quanh.

Khác là số này tính là các ký tự đặc biệt - bạn đã nêu không phải là chữ cái, số mà tôi đưa vào số trung bình. Nếu bạn không muốn đếm số, thì sử dụng r"\b(is)\b" là giải pháp đúng.

+0

Bạn thực sự nên sử dụng '\ b' cho điều đó. – georg

+0

@ thg435 Vì cái gì, xin lỗi? –

+0

're.search (r '\ bis \ b')' - nếu không bạn cũng khớp với ký hiệu trước đó và vị trí sai. – georg

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