Python3正则使用\w却能匹配中文问题

# 正则中\w等同于[A-Za-z0-9_],但是由于Python3的re库默认使用的是Unicode字符集,导致也能匹配中文
# 通过指定匹配ASCII字符即可解决问题
import re
pattern = re.compile(r'\w+', re.ASCII) # 使用ASCII标志
# pattern = re.compile(r'\w+', re.A) # 使用ASCII标志
text = "hello_世界123"
matches = pattern.findall(text)
print(matches)

re模块的多种标志(flags)说明:

  1. re.ASCII / re.A

    • 使 \w, \W, \b, \B, \d, \D, \s, 和 \S 只匹配ASCII字符,而不是匹配Unicode字符。
  2. re.IGNORECASE / re.I

    • 使匹配对大小写不敏感。例如,[A-Z] 也会匹配小写字母,[a-z] 也会匹配大写字母。
  3. re.MULTILINE / re.M

    • 多行模式。影响 ^$ 的行为。^ 匹配字符串的开始以及每行的开始(紧跟在每个换行符之后),$ 匹配字符串的结束以及每行的结束(紧跟在每个换行符之前)。
  4. re.DOTALL / re.S

    • 使 .(点号)匹配任何字符,包括换行符。默认情况下,. 不匹配换行符。
  5. re.VERBOSE / re.X

    • 详细模式。这允许你组织正则表达式,使其更易于阅读。在该模式下,空白字符被忽略,除非在字符类中或被转义,且#可用于引入注释。
  6. re.DEBUG

    • 打印关于编译表达式的调试信息。
  7. re.UNICODE / re.U

    • 使 \w, \W, \b, \B, \d, \D, \s, 和 \S 执行Unicode匹配而不是ASCII匹配。这是Python 3中的默认行为,因此通常不需要显式设置。

也可以组合使用,例如:re.I | re.M