2013-07-10 30 views
6

Tôi muốn tìm các từ có cặp chữ cái liên tiếp bằng regex. Tôi biết chỉ một cặp liên tiếp như sở thú (oo), câu đố (zz), sắp xếp (rr), có thể đạt được bằng '(\w){2}'. Nhưng làm thế nào vềpython: làm thế nào để tìm các cặp liên tiếp của các chữ cái bằng regex?

  • hai cặp liên tiếp: ủy ban (ttee)
  • ba cặp liên tiếp: nhân viên kế toán (ookkee)

chỉnh sửa:

  • '(\w){2}' thực sự là sai , nó tìm thấy bất kỳ hai chữ cái thay vì một cặp thư đôi.
  • Mục đích của tôi là tìm các từ từ có cặp thư, chứ không phải cặp.
  • Bằng 'liên tiếp', tôi có nghĩa là không có thư nào khác giữa các cặp thư.
+1

thể trùng lặp của [Return từ với chữ đôi liên tiếp] (http://stackoverflow.com/ question/9593622/return-words-with-double-liên-chữ cái) – ChrisGuest

+0

'\ w {2}' chỉ đề cập đến hai chữ cái, 'ab', 'cc' đều OK. – zhangyangyu

+0

thực sự, '(\ w) {2}' khớp với bất kỳ 2 chữ cái liên tiếp nào, phù hợp hay không. Nó sẽ khớp với 'zo' trên 'sở thú'. –

Trả lời

4

Bạn có thể sử dụng mô hình này:

[a-z]*([a-z])\1([a-z])\2[a-z]* 

ý tưởng là sử dụng backreferences \1\2 mà tham khảo các nhóm chụp.

Lưu ý rằng (\w){2} khớp với hai ký tự từ nhưng không giống ký tự.

+0

Nó hoạt động! Vì vậy, để tìm các từ của ba cặp chữ cái liên tiếp, regex sẽ là '[az] * ([az]) \ 1 ([az]) \ 2 [az] * ([az]) \ 3 [az] *', nhưng nó không chỉ tìm thấy ** bookkeeper ** mà còn ** greenness **, phá vỡ quy tắc 'liên tục'. Làm thế nào để tránh điều này? –

+1

@Teacode: không cho ba bạn phải viết: '[a-z] * ([a-z]) \ 1 ([a-z]) \ 2 ([a-z]) \ 3 [a-z] *' –

+0

Bạn đã đúng! Cảm ơn bạn. Cảm thấy xấu hổ vì sai lầm của tôi, tôi là một người mới bắt đầu với regex. –

14

Sử dụng re.finditer

>>> [m.group() for m in re.finditer(r'((\w)\2)+', 'zoo')] 
['oo'] 
>>> [m.group() for m in re.finditer(r'((\w)\2)+', 'arrange')] 
['rr'] 
>>> [m.group() for m in re.finditer(r'((\w)\2)+', 'committee')] 
['mm', 'ttee'] 
>>> [m.group() for m in re.finditer(r'((\w)\2)+', 'bookkeeper')] 
['ookkee'] 

Kiểm tra xem chuỗi chứa cặp liên tiếp:

>>> bool(re.search(r'((\w)\2){2}', 'zoo')) 
False 
>>> bool(re.search(r'((\w)\2){2}', 'arrange')) 
False 
>>> bool(re.search(r'((\w)\2){2}', 'committee')) 
True 
>>> bool(re.search(r'((\w)\2){2}', 'bookkeeper')) 
True 

Bạn cũng có thể sử dụng sau đây không chụp (?:) phiên bản:

(?:(\w)\1){2} 
+0

Tôi đoán câu hỏi của tôi đã được hình thành không đúng. Thay vì tìm các cặp thư từ một từ, những gì tôi thực sự muốn làm là tìm các từ (từ một danh sách từ) có các cặp chữ cái liên tiếp. –

+0

@Teacode, tôi đã cập nhật mã. – falsetru

+0

Cảm ơn bạn. Bây giờ tôi đã nhận nó. '((\ w) \ 2) {3}' tương đương với '(\ w) \ 1 (\ w) \ 2 (\ w) \ 3', và thanh lịch hơn! –

0

Bởi vì bạn đã đề cập rằng bạn muốn kiểm tra từ danh sách, tôi đã trả lời là như là. Sử dụng câu trả lời falsetru của:

newlist = [] 

for word in list: 
    if [m.group() for m in re.finditer(r'((\w)\2)+', word)] != []: 
    newlist.append(word) 

print newlist 
0

Đối với việc phát hiện 2-hoặc-nhiều chữ liên tiếp regex trở thành: (\w)\1+

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