Liệu có phải là một chữ số trong regex có nghĩa là một chữ số không?


147

Tôi thấy rằng trong 123, \dtrận đấu 13nhưng không 2. Tôi đã tự hỏi nếu \dphù hợp với một chữ số đáp ứng loại yêu cầu? Tôi đang nói về regex phong cách Python.

Plugin biểu thức chính quy trong Gedit đang sử dụng regex kiểu Python. Tôi đã tạo một tệp văn bản với nội dung của nó là

123

Chỉ 13được khớp bởi regex \d; 2không phải.

Nói chung đối với một chuỗi các số có chữ số không có các ký tự khác ở giữa, chỉ có các chữ số thứ tự lẻ là khớp nhau, và các chữ số thứ tự chẵn thì không. Ví dụ trong 12345, các trận đấu là 1, 35.


4
\dsẽ phù hợp 1, 23. Nếu nó không phải có một cái gì đó khác trong biểu hiện của bạn. Bạn có thể hiển thị đầy đủ biểu hiện của bạn?
Alex Aza

4
\dlà tốc ký [0-9], vì vậy nó phải phù hợp 2. Vui lòng gửi một trường hợp thử nghiệm hoàn chỉnh (một kịch bản có thể chạy, thể hiện vấn đề của bạn) và có thể chúng tôi có thể tìm ra điều gì sai.
zwol

@delnan: "Tôi thấy rằng trong 123, \ d khớp với 1 và 3 nhưng không phải 2" nghe có vẻ khá cụ thể đối với tôi.
Amber

@Amber: Chết tiệt, tôi không nhớ!

5
Được rồi, tôi không đăng bài này dưới dạng câu trả lời vì tôi không biết , nhưng tôi nghĩ những gì đang diễn ra là gedit từ chối bắt đầu một trận đấu mới ngay sau khi kết thúc trận đấu trước - nó bỏ qua một nhân vật, bất kể đó là gì , trước khi thử khớp lại. Vui lòng thử kết hợp 1111122222.
zwol

Câu trả lời:


459

[0-9] không phải lúc nào cũng tương đương với \d. Trong python3, [0-9]chỉ khớp các 0123456789ký tự, trong khi \dkhớp [0-9]và các ký tự chữ số khác, ví dụ như các chữ số Đông Ả Rập ٠١٢٣٤٥٦٧٨٩.


3
Thử điều này trong REPL: import re, re.match(r'\d', '٠١٢٣٤٥٦٧٨٩')hiển thị không khớp
nickf

1
@nickf hãy thử nó trên python3.
wim

2
Đối với tiếng Ba Tư và tiếng Ả Rập, trong các công cụ java và javascript, hãy sử dụng \ p {Nd}
Alireza Fattahi

6
+1, nhưng mmmm ... thẻ của OP là Python\dkhớp với bất kỳ chữ số Unicode nào chỉ có trong Python3. Trong Python 2.7, ASCII cũ vẫn [0-9]có thể đáng để làm rõ điều đó trong câu trả lời. :)
zx81

1
@FarazAhmad, có lẽ là không, bạn phải chỉ định riêng tất cả các ký tự
Kirill Polishchuk

13

\dphù hợp với bất kỳ chữ số nào trong hầu hết các kiểu ngữ pháp regex, bao gồm cả python. Tham khảo Regex


8

Trong regex kiểu Python, \dkhớp với bất kỳ chữ số riêng lẻ nào. Nếu bạn đang nhìn thấy thứ gì đó dường như không làm điều đó, vui lòng cung cấp regex đầy đủ mà bạn đang sử dụng, trái ngược với việc chỉ mô tả một biểu tượng cụ thể đó.

>>> import re
>>> re.match(r'\d', '3')
<_sre.SRE_Match object at 0x02155B80>
>>> re.match(r'\d', '2')
<_sre.SRE_Match object at 0x02155BB8>
>>> re.match(r'\d', '1')
<_sre.SRE_Match object at 0x02155B80>

Cảm ơn! Trình phân tích cú pháp regex của tôi là plugin biểu thức chính quy trong gedit. Toàn bộ nội dung là 123.
Tim

7

\\d{3} khớp với bất kỳ chuỗi ba chữ số nào trong Java.


@ amal-Murali, Cách sử dụng biểu thức này để khớp với bất kỳ chuỗi chữ số nào trong java.
hasan.alkhatib

2
@HasanKhatib:\\d+
Amal Murali

5

Đây chỉ là một phỏng đoán, nhưng tôi nghĩ rằng trình soạn thảo của bạn thực sự khớp với từng chữ số - 1 2 3- nhưng chỉ các 123kết quả trùng khớp lẻ được tô sáng, để phân biệt với trường hợp khi toàn bộ chuỗi được khớp.

Hầu hết các bảng điều khiển regex làm nổi bật các kết hợp liền kề với các màu khác nhau, nhưng do cài đặt plugin, giới hạn đầu cuối hoặc vì một số lý do khác, chỉ mọi nhóm khác có thể được làm nổi bật trong trường hợp của bạn.


1

Thông tin liên quan đến .NET / C #:

Ký tự chữ số thập phân: \ d \ d khớp với bất kỳ chữ số thập phân nào. Nó tương đương với mẫu biểu thức chính quy \ p {Nd}, bao gồm các chữ số thập phân tiêu chuẩn 0-9 cũng như các chữ số thập phân của một số bộ ký tự khác.

Nếu hành vi tuân thủ ECMAScript được chỉ định, \ d tương đương với [0-9]. Để biết thông tin về biểu thức chính quy ECMAScript, hãy xem phần "Hành vi đối sánh ECMAScript" trong Tùy chọn biểu thức chính quy.

Thông tin: https://docs.microsoft.com/en-us/dotnet/stiteria/base-types/character-classes-in-THER-expressions#decimal-digit-character-d

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.