2009-06-21 33 views
7

Câu hỏi:
Có thể, với regex, để khớp với một từ có chứa cùng một ký tự ở các vị trí khác nhau không?Có thể kết hợp lặp lại ký tự với regex không? Làm sao?

Tình trạng:
Tất cả các từ có cùng độ dài, bạn biết được vị trí ký tự (ví dụ 1, 2 và thứ 4) của char lặp đi lặp lại, nhưng bạn không biết nó là gì.

Ví dụ:
sử dụng chữ thường 6char Tôi muốn đối sánh các từ nơi ký tự thứ 3 và thứ 4 giống nhau.

parrot <- match for double r 
follia <- match for double l 
carrot <- match for double r 
mattia <- match for double t 
rettoo <- match for double t 
melone <- doesn't match 

Tôi không thể sử dụng trình định lượng [\ d] {2} vì nó khớp với bất kỳ hai ký tự nào và nếu tôi nói vị trí thứ 2 và thứ 4 thay vì thứ 3 và thứ 4 thì sao?

Tôi có thể làm những gì tôi muốn với regex không? Nếu có, làm thế nào tôi có thể làm điều đó?

EDIT:
Ask hỏi trong các ý kiến, tôi đang sử dụng python

+2

Công cụ biểu thức chính quy có thể khác nhau rất nhiều giữa các ngôn ngữ và công cụ. Vì vậy, bạn nên luôn luôn nói những gì ngôn ngữ hoặc công cụ bạn đang làm việc với (Perl? Python? Grep? C và một thư viện?) – Telemachus

+0

thực hiện! Cảm ơn! (15char) –

+0

Đây có phải là bài tập về nhà không? –

Trả lời

26

Bạn có thể sử dụng một backreference để làm điều này:

(.)\1 

này sẽ phù hợp xuất hiện liên tiếp của bất kỳ nhân vật.


Sửa Dưới đây là một số ví dụ Python:

import re 

regexp = re.compile(r"(.)\1") 
data = ["parrot","follia","carrot","mattia","rettoo","melone"] 

for str in data: 
    match = re.search(regexp, str) 
    if match: 
     print str, "<- match for double", match.group(1) 
    else: 
     print str, "<- doesn't match" 
+1

thay thế cho điều này là (aa | bb | cc | ..zz | AA | BB | lol) – dfa

+0

Khá muộn, nhưng để tham khảo, có thể đáng chú ý rằng regexp đặc biệt này thực sự chỉ khớp với sự lặp lại đầu tiên của ký tự (re.search (r "(.) \ 1", "parrrrrot") nhóm (0) sản lượng 'rr'). Để phù hợp với tất cả các lần xuất hiện (và có thể trích xuất nhóm lặp) bạn có thể muốn sử dụng: re.search (r "((.) \ 2+)", "parrrrot"). (1) (cho kết quả chính xác) answer 'rrrr') – Rick77

2

/(\b\w*?(\w)\2.*?\b)/

sẽ phù hợp với bất kỳ từ nào với ít nhất trên nhân vật lặp lại $ 1 là từ $ 2 sự lặp lại đầu tiên.

7

Bạn cần sử dụng tham chiếu ngược cho các trường hợp như vậy. Tôi không chắc chắn bạn đang sử dụng ngôn ngữ nào, tôi đã thử ví dụ sau trong trình soạn thảo VI của tôi để tìm kiếm bất kỳ bảng chữ cái nào lặp lại. Pattern Regex:\([a-z]\)\1

Nếu bạn thấy ví dụ này, [a-z] là mẫu bạn đang tìm kiếm, và kèm theo đó bên trong ngoặc đơn (các parantheses nên được thoát trong một số ngôn ngữ). Một khi bạn có một dấu ngoặc đơn, nó là một nhóm và có thể được gọi lại bất cứ nơi nào trong regex bằng cách sử dụng \ 1. Nếu có nhiều nhóm, bạn có thể sử dụng \ 1, \ 2, v.v. \ 1 sẽ được thay thế bằng bất kỳ thứ gì được khớp trong nhóm đầu tiên.

Cảm ơn Arvind

0

Có, bạn có thể sử dụng backreference xây dựng để phù hợp với các chữ kép.

Cụm từ thông dụng (?<char>\w)\k<char>, sử dụng nhóm được đặt tên và hội thảo ngược, tìm kiếm các ký tự ghép nối liền kề. Khi được áp dụng cho chuỗi "Tôi sẽ có một ly cà phê nhỏ", nó tìm thấy các từ phù hợp trong các từ "Tôi", "nhỏ" và "cà phê".Các metacharacter \w tìm thấy bất kỳ ký tự một từ nào. Cấu trúc nhóm (?<char>) bao quanh metacharacter để buộc động cơ biểu thức chính quy nhớ một kết hợp biểu thức con (trong trường hợp này, sẽ là bất kỳ ký tự đơn nào) và lưu nó dưới tên "char". Cấu trúc backreference \k<char> làm cho động cơ so sánh ký tự hiện tại với ký tự được khớp trước đó được lưu trữ trong "char". Toàn bộ cụm từ thông dụng thành công tìm thấy kết quả khớp ở bất kỳ đâu một ký tự đơn giống với ký tự trước đó.

+0

Bạn nên luôn sử dụng các dấu gạch chéo hoặc các khối mã để định dạng bất kỳ mã nguồn nào bạn đưa vào bài đăng của mình. Câu trả lời này không có ý nghĩa gì cả cho đến khi tôi thêm backticks xung quanh regexes của bạn. –

+0

Rất tiếc !! Lỗi của tôi! Cảm ơn Alan :) –

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