Python re模块DeprecationWarning:正则中\d+应使用何种替代方案?
嘿,我来帮你解决这个DeprecationWarning的问题~
首先,咱们先搞清楚为啥会出现这个警告:在Python 3.6的re模块里,默认是Unicode模式,\d会匹配所有Unicode十进制数字(比如全角数字、阿拉伯-Indic数字这类非ASCII数字)。如果你的代码原本期望\d只匹配0-9的ASCII数字,就可能触发这个 deprecation 警告,提示你这种用法可能有歧义。
除了你提到的[0-9]+,还有这些替代方案:
用POSIX字符类
[[:digit:]]+:
这个写法更贴近“数字”的语义,默认模式下和\d行为一致(匹配所有Unicode数字);如果加上re.ASCII标志,就会严格匹配0-9的ASCII数字,和[0-9]+等价。比如:import re pattern = re.compile(r'\nRevision: ([[:digit:]]+)\n', re.ASCII)保留
\d+但添加re.ASCII标志:
如果你不想改正则表达式的写法,直接给re.compile加上re.ASCII(或者简写re.A)标志,就能把\d的匹配范围限制为ASCII数字,同时消除警告:import re pattern = re.compile(r'\nRevision: (\d+)\n', re.ASCII)另外建议你把正则写成原始字符串(加
r前缀),像上面这样,避免手动转义\n和\d的麻烦,代码也更清晰。极端明确写法
[0123456789]+:
这就是把0到9每个数字都列出来,效果和[0-9]+完全一样,适合那种需要绝对明确匹配范围的场景,不过一般没必要这么写。
总结一下:如果只需要匹配ASCII数字,[0-9]+或者带re.ASCII的\d+/[[:digit:]]+都是靠谱的选择;如果需要匹配所有Unicode数字,[[:digit:]]+或者不加标志的\d+(但要注意警告的问题,Python 3.7+可能调整了相关警告逻辑)也可以用。
内容的提问来源于stack exchange,提问作者mchfrnc

