在 [\w\d] 中,\d 是不是多余的?

6
我正在阅读一本书,看到很多像这样的例子:

我正在阅读一本书,看到很多像这样的例子:

(?P<email>
[\w\d.+-]+ # username
@
([\w\d.]+\.)+ # domain name prefix
(com|org|edu) # limit the allowed top-level domains
)

由于\w表示[a-zA-Z0-9_]\d表示[0-9],所以\d\w的子集。
因此,这些\d是否冗余呢?请有经验的人确认我理解的正确性,因为这让我烦恼。


也许他们特别寻找以数字结尾的单词,例如smith7或jones5。 - John Gordon
2
@JohnGordon 如果是这样的话,他们会将\d标记放在分组之外,而不是内部。 - R Nar
2
这表明这在任何情况下都是一个无意义的练习:http://davidcel.is/posts/stop-validating-email-addresses-with-regex/ - davejagoda
1
是的,它是的。 <°))))))))))))))> - Casimir et Hippolyte
我想看看即使像Lavavej这样的专家也能写出比基于简单状态机的解析器更易于调试的正则表达式。例如,在(text with "strings) and \"quotes in strings\")")中查找匹配的关闭括号,您必须考虑引号和反斜杠转义(这不是常见的解析情况)。真正适合这种情况的正确工具是词法分析器,但手写状态机解析器要比等效的正则表达式简单得多。jwz的引用语句不应该被愚蠢地“应用”,但它本身并不愚蠢。 - rmunn
显示剩余7条评论
1个回答

6

是的,这有些多余了,直接使用\w同样有效。请参见https://docs.python.org/2/library/re.html

\d

当未指定UNICODE标志时,匹配任何十进制数;与集合[0-9]等效。使用UNICODE,它将匹配在Unicode字符属性数据库中分类为十进制数的任何内容。

\w

当未指定LOCALEUNICODE标志时,匹配任何字母数字字符和下划线;与集合[a-zA-Z0-9_]等效。如果指定了LOCALE,它将匹配当前语言环境中定义为字母数字的[0-9_]集合加上任何字符。如果设置了UNICODE,则会匹配字符[0-9_]以及在Unicode字符属性数据库中分类为字母数字的任何内容。


你为什么在Python的问题中链接到Perl文档? - chepner
该模块提供类似于Perl中的正则表达式匹配操作。其中https://docs.python.org/2/library/re.html的第一句话特别提到了Perl的正则表达式。 - davejagoda
@davejagoda:不,它们看起来相似,但并不相同。不要将一种语言的参考用于另一种语言。 - nhahtdh

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