在正则表达式中,"\d"是否表示数字?

222

我发现在123中,\d匹配13,但不匹配2。 我想知道\d匹配哪些满足要求的数字?我谈论的是Python风格的正则表达式。

Gedit的正则表达式插件使用Python风格的正则表达式。我创建了一个文本文件,其内容为:

123

正则表达式 \d 只匹配数字 13,不会匹配数字 2

通常情况下,对于一个没有其他字符间隔的数字序列,只有奇数位上的数字会被匹配,偶数位上的数字不会被匹配。例如,在数字序列 12345 中,匹配的数字是 135


6
\d将匹配123。如果没有匹配成功,那么你的表达式中一定还有其他内容。请展示完整的表达式。 - Alex Aza
6
\d是表示数字[0-9]的快捷方式,因此它应该匹配到数字2。请提供完整的测试用例(可运行的脚本,演示您的问题),或许我们可以找出问题所在。 - zwol
@delnan说:“我发现在123中,\d匹配1和3但不匹配2”,听起来对我来说很具体。 - Amber
\d只匹配123中的1。尝试使用\d+匹配123。 - Jochen Ritzel
8
好的,我会尽力进行翻译。以下是需要翻译的内容:好的,我没有把这个作为答案发布,因为我不确定,但我认为发生的情况是 gedit 拒绝在前一个匹配结束后立即开始新的匹配 - 它会跳过一个字符(无论它是什么)然后再次尝试匹配。请尝试将 1111122222 进行匹配。 - zwol
显示剩余3条评论
6个回答

591

[0-9]并不总是等价于\d。在Python3中,[0-9]只匹配0123456789这些数字字符,而\d则可以匹配[0-9]和其他一些数字字符,例如阿拉伯语东部数字٠١٢٣٤٥٦٧٨٩


5
在REPL中尝试此操作:import re, re.match(r'\d', '٠١٢٣٤٥٦٧٨٩'),结果没有匹配。 - nickf
2
对于波斯语和阿拉伯语,在Java和JavaScript引擎中,请使用\p{Nd}。 - Alireza Fattahi
8
+1,但是嗯... OP的标签是Python,而\d只在Python3中匹配任何Unicode数字。在Python 2.7中仍然是旧的ASCII [0-9] - 在答案中澄清这一点可能是值得的。 :) - zx81
1
@FarazAhmad,可能不行,您必须单独指定所有字符。 - Kirill Polishchuk
1
如果你想让\d只匹配[0-9],你可以使用ASCII标志。例如:re.search('\d', 'string_to_search', flags=re.ASCII)。参见:https://docs.python.org/3/library/re.html#re.ASCII - Caumons
显示剩余4条评论

21

16
在Python风格的正则表达式中,\d匹配任何单个数字。如果您看到的东西似乎并不是这样,请提供您正在使用的完整正则表达式,而不仅仅是描述那个特定符号。
>>> 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>

谢谢!我的正则表达式解析器是 Gedit 中的正则表达式插件。整个内容是 123 - Tim

11

\\d{3} 在Java中匹配任何三个数字的序列。


@amal-murali,如何在Java中使用此表达式以匹配任何数字序列。 - hasan.alkhatib
7
\\d+ 表示匹配一个或多个数字。 - Amal Murali

8

我只是猜测,但我认为您的编辑器实际上匹配每个数字 — 1 2 3 — 但仅高亮显示奇数匹配项,以区分与整个字符串123匹配的情况。

大多数正则表达式控制台都使用不同颜色突出显示连续匹配项,但由于插件设置、终端限制或其他原因,在您的情况下可能仅高亮显示每个其他组。


2

.NET/C#相关信息:

十进制数字字符:\d \d匹配任何十进制数字。它等同于\p{Nd}正则表达式模式,包括标准的十进制数字0-9以及其他字符集中的十进制数字。

如果指定了符合ECMAScript规范的行为,则\d等同于[0-9]。有关ECMAScript正则表达式的信息,请参阅“正则表达式选项”中的“ECMAScript匹配行为”部分。

信息:https://learn.microsoft.com/en-us/dotnet/standard/base-types/character-classes-in-regular-expressions#decimal-digit-character-d


当在正则表达式源生成器中使用'\d'时,它使用char.IsDigit(),它泛化为CharUnicodeInfo.GetUnicodeCategory(c) == UnicodeCategory.DecimalDigitNumber。这将匹配Nd类别中的任何内容:https://www.compart.com/en/unicode/category/Nd - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接