Python 正则表达式,\d 可以匹配到全角数字吗?

话不多说,上代码

import re
pattern_id = re.compile("(\d+)_E(\d+)_C(\d+)_P(\d+)")
file_name = "毛刺 A 1 127210853300_E2_C2_P2.bmp"
print(pattern_id.findall(file_name)[0])

结果竟然是

('1 127210853300', '2', '2', '2')

竟然最前面的那个全角 1 被匹配上了!

(由于我浏览器启用了自动加空格功能…… 澄清一下阿~1 和 12 之间没有空格)

所以说全角数字也是数字了么?


Python 正则表达式,\d 可以匹配到全角数字吗?

8 回复


macos 表示不行


\d 在 Python 的 re 模块中默认只匹配 ASCII 数字(0-9),不能匹配全角数字(如123)。要匹配全角数字,可以使用 Unicode 属性 \p{N}(需安装 regex 库)或在模式中显式指定全角数字范围 [\uFF10-\uFF19]

示例代码:

import re
import regex  # 第三方库,需安装:pip install regex

text = "测试:123 123"

# 1. 标准 re 模块:\d 不匹配全角数字
print("re.findall(r'\\d+', text):", re.findall(r'\d+', text))  # 输出: ['123']

# 2. 使用 regex 库的 Unicode 属性匹配所有数字字符
print("regex.findall(r'\\p{N}+', text):", regex.findall(r'\p{N}+', text))  # 输出: ['123', '123']

# 3. 显式指定全角数字范围(适用于 re 模块)
print("re.findall(r'[0-9\uFF10-\uFF19]+', text):", 
      re.findall(r'[0-9\uFF10-\uFF19]+', text))  # 输出: ['123', '123']

总结: 处理混合字符时建议用 regex 库或显式定义数字范围。

澄清一下,1和 12 之间没有空格,空格是我浏览器自动加上的……去掉再试一下?

![屏幕快照 2018-12-16 下午 8.03.11.png]( https://i.loli.net/2018/12/16/5c163f6f82b7a.png)

原来是空格的问题…

这个估计是和 local 有关系

说错 应该是 locale

Python 3 对于 str pattern 会匹配 unicode 的数字,对于 bytes 只匹配 [0-9],也可以设置 re.ASCII。

楼上正解,可以用 ASCII 控制 unicode pattern 只匹配 ASCII

https://docs.python.org/3/library/re.html#re.ASCII

回到顶部