Regex này sẽ nhận được 456. Câu hỏi của tôi là tại sao nó không thể là 234 trên 1-234-56? 56 có đủ điều kiện (?!\d)) mẫu vì nó không phải là một số duy nhất. (?!\d)) Điểm bắt đầu tìm kiếm ở đâu?
import re
mẫu = re.compile(r'\d{1,3}(?=(\d{3})+(?!\d))')
a = sample.findall("Số là: 123456") ;
Thêm dấu phân cách bằng dấu phẩy ở giai đoạn đầu tiên, chẳng hạn như 123.456.
a = sample.findall("Số là: 123456") ;
kết quả = mẫu.finditer('123456')
cho kết quả trong kết quả:
in (result.start(), result.end(), result)
Câu hỏi của tôi là tại sao KHÔNG THỂ 234
from 1-234-56
?
Điều này là không thể bởi vì (?=(\d{3})+(?!\d))
Một chuỗi gồm 3 chữ số phải xuất hiện sau chuỗi 1-3 chữ số. 56
(Nhóm số cuối cùng trong kịch bản tưởng tượng của bạn) là nhóm số có 2 chữ số. Vì các bộ định lượng có thể lười biếng hoặc tham lam nên bạn không thể kết hợp các số có một, hai và ba chữ số với \d{1,3}
cuộc thi đấu. bắt đầu từ 234
获取 123456
, bạn cần một biểu thức chính quy tùy chỉnh cho nó: \B\d{3}
, (?<=1)\d{3}
甚至 \d{3}(?=\d{2}(?!\d))
.
Làm 56
phù hợp với (?!\d))
điểm bắt đầu mà (?!\d)) sẽ tìm kiếm ở đâu?
Không, đó là một cái nhìn tiêu cực, nó không khớp, nó chỉ kiểm tra xem có chữ số nào sau vị trí hiện tại trong chuỗi đầu vào hay không. Nếu có số thì khớp không thành công (không tìm thấy kết quả và trả về kết quả).
Ghi chú thêm về lookahead: Nó nằm ở (\d{3})+
sau mẫu con, do đó công cụ biểu thức chính quy bắt đầu tìm kiếm số sau 3 chữ số cuối của mảng và nếu tìm thấy số đó thì kết quả khớp không thành công (vì đó là một cái nhìn tiêu cực). tóm lại,(?!\d)
là ranh giới kết thúc/cuối của các số trong biểu thức chính quy này.
Phân đoạn chi tiết hơn:
-
\d{1,3}
- Chuỗi từ 1 đến 3 chữ số, càng nhiều càng tốt (sử dụng bộ lượng hóa tham lam)
-
(?=(\d{3})+(?!\d))
- Nhìn về phía trước ( (?=...)
), một chuỗi gồm 1-3 chữ số để kiểm tra xem kết quả khớp trước đó có
-
(\d{3})+
- 1 hoặc nhiều hơn ( +
) dãy có đúng 3 chữ số...
-
(?!\d)
- không có số theo sau.
Lookahead không khớp, không tiêu tốn ký tự, nhưng bạn vẫn có thểchiếm lấynội dung trong đó. Khi thực hiện tra cứu, chỉ số biểu thức chính quy giống với ký tự trước đó. Vượt qua biểu thức chính quy và đầu vào của bạn, bạn có thể chuyển đổi 123
Và \d{1,3}
Ghép sao cho bạn có được dãy 3 chữ số ( 456
). Nhưng 456
Nhìn về phía trướcchiếm lấy,Và tìm lại
Chỉ văn bản đã chụp được trả về nếu nhóm chụp được đặt.
Để thêm dấu phẩy làm ký hiệu nhóm số, hãy sử dụng
rx = r'\d(?=(?:\d{3})+(?!\d))'
Nhìn thấy Bản demo IDEONE
Tôi là một lập trình viên xuất sắc, rất giỏi!