2010-09-02 36 views
14

Có cách nào sử dụng regex để khớp với một bộ ký tự lặp lại không? Ví dụ:lặp lại nhiều ký tự regex

ABCABCABCABCABC

ABC{5}

Tôi biết đó là sai. Nhưng liệu có cái gì để phù hợp với hiệu ứng đó?

Cập nhật:

Bạn có thể sử dụng nhóm chụp lồng nhau không? Vì vậy, một cái gì đó như (?<cap>(ABC){5})?

Trả lời

34

Kèm theo regex bạn muốn lặp lại trong dấu ngoặc đơn. Ví dụ, nếu bạn muốn 5 lần lặp lại của ABC:

(ABC){5} 

Hoặc nếu bạn muốn bất kỳ số lần lặp lại (0 trở lên):

(ABC)* 

Hoặc một hoặc nhiều lần lặp lại:

(ABC)+ 

chỉnh sửa để phản hồi cập nhật

Dấu ngoặc đơn trong biểu thức chính quy làm hai việc; chúng nhóm lại với nhau một chuỗi các mục trong một biểu thức chính quy, để bạn có thể áp dụng toán tử cho toàn bộ chuỗi thay vì chỉ mục cuối cùng và chúng nắm bắt nội dung của nhóm đó để bạn có thể trích xuất chuỗi con phù hợp với biểu thức con đó trong regex.

Bạn có thể lồng dấu ngoặc đơn; chúng được tính từ lần mở đầu tiên. Ví dụ:

>>> re.search('[0-9]* (ABC(...))', '123 ABCDEF 456').group(0) 
'123 ABCDEF' 
>>> re.search('[0-9]* (ABC(...))', '123 ABCDEF 456').group(1) 
'ABCDEF' 
>>> re.search('[0-9]* (ABC(...))', '123 ABCDEF 456').group(2) 
'DEF' 

Nếu bạn muốn tránh chụp khi bạn đang nhóm, bạn có thể sử dụng (?:. Điều này có thể hữu ích nếu bạn không muốn các dấu ngoặc đơn mà bạn chỉ sử dụng để nhóm lại một chuỗi với mục đích áp dụng toán tử để thay đổi việc đánh số các kết quả phù hợp của bạn. Nó cũng nhanh hơn.

>>> re.search('[0-9]* (?:ABC(...))', '123 ABCDEF 456').group(1) 
'DEF' 

Vì vậy, để trả lời cập nhật của bạn, có, bạn có thể sử dụng các nhóm chụp lồng nhau, hoặc thậm chí tránh chụp với nhóm nội tại tất cả:

>>> re.search('((?:ABC){5})(DEF)', 'ABCABCABCABCABCDEF').group(1) 
'ABCABCABCABCABC' 
>>> re.search('((?:ABC){5})(DEF)', 'ABCABCABCABCABCDEF').group(2) 
'DEF' 
+2

Tôi sẽ sử dụng + tại đây thay vì *, vì * sẽ khớp với 0 lần xuất hiện (ABC). – Robusto

+4

(ABC) {3,5} cũng cho một loạt các lần lặp lại –

+0

Oh duh. Tôi đã suy nghĩ() chỉ được sử dụng cho các công cụ chụp cho một số lý do. Nhưng điều đó có ý nghĩa. Được chọn là lần đầu tiên – Falmarri

3

(ABC){5} nên làm việc cho bạn

1

ngoặc "()" được sử dụng để nhóm các ký tự và biểu thức trong các cụm từ thông dụng phức tạp hơn, lớn hơn. Các bộ định lượng ngay lập tức theo nhóm áp dụng cho cả nhóm.

(ABC){5} 
3

ABC {5} khớp với ABCCCCC. Để phù hợp với 5 ABC, bạn nên sử dụng (ABC) {5}. Dấu ngoặc đơn được sử dụng để nhóm một tập hợp các ký tự. Bạn cũng có thể đặt khoảng thời gian cho các lần xuất hiện như (ABC) {3,5} khớp với ABCABCABC, ABCABCABCABC và ABCABCABCABCABC.

(ABC) {1,} có nghĩa là 1 hoặc nhiều lần lặp lại giống hệt như (ABC) +.

(ABC) {0,} có nghĩa là 0 hoặc nhiều lần lặp lại giống hệt như (ABC) *.

0

Khi cập nhật cho câu hỏi-

Bạn có thể lồng nhóm chụp. Chỉ số nhóm chụp được tăng theo mỗi lần mở.

(((ABC)*)(DEF)*) 

Feeding rằng regex ABCABCABCDEFDEFDEF, chụp nhóm 0 trận đấu toàn bộ điều, 1 cũng là toàn bộ điều, 2 là abcabcabc, 3 là ABC, và 4 là DEF (vì sao là bên ngoài của nhóm chụp) .

Nếu bạn có sự thay đổi bên trong một nhóm chụp và lặp lại ngay bên ngoài, sau đó điều này có thể có được một chút rung rinh nếu bạn không mong đợi nó ...

(a[bc]*c)* 

khi abbbcccabbc ăn sẽ trở lại với cuối cùng khớp với nhóm chụp 1, trong ví dụ này chỉ là abbc, vì nhóm chụp được đặt lại với toán tử lặp lại.

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