Python正则表达式:带有re.ASCII的模式仍然可以匹配unicode字符吗?

2024-04-25 21:28:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python正则表达式的新手,正在尝试匹配Python中的非空白ASCII字符

以下是我的代码:

impore re

p = re.compile(r"[\S]{2,3}", re.ASCII)

p.search('1234')  # have some result

p.search('你好吗') # also have result, but Why?

我已经在re.compile中指定了ASCII模式,但是p.search('你好吗')仍然有结果。我想知道我做错了什么


Tags: 代码researchhaveasciisomeresult字符
1条回答
网友
1楼 · 发布于 2024-04-25 21:28:23

re.A标志只影响速记字符类匹配的内容

在Python3.x中,shorthand character classes支持Unicode,默认情况下,Python 2.x ^{}/^{}处于启用状态。这意味着:

  • \d匹配任何Unicode十进制数字(即Unicode字符类别中的任何字符[Nd]
  • \D匹配任何非十进制数字的字符(因此,除了^{} Unicode category中的字符以外的所有字符)
  • \w-匹配Unicode单词字符;这包括任何语言中可以作为单词一部分的大多数字符,以及数字和下划线(因此,\w+匹配My name is Виктор字符串中的每个单词)
  • \W-匹配任何非单词字符的字符。这与\w相反(因此,它将不匹配任何Unicode字母或数字。)
  • \s-匹配Unicode空格字符(它将匹配NEL、硬空格等)
  • \S-匹配任何非空白字符的字符(因此,与NEL、硬空间等不匹配)
  • \b-单词边界匹配Unicode字母/数字和非字母/数字之间的位置或字符串的开始/结束
  • \B-非单词边界匹配两个Unicode字母/数字、两个非字母/数字之间的位置,或Unicode非字母/数字和字符串的开始/结束之间的位置

如果要禁用此行为,请使用re.Are.ASCII

Make \w, \W, \b, \B, \d, \D, \s and \S perform ASCII-only matching instead of full Unicode matching. This is only meaningful for Unicode patterns, and is ignored for byte patterns. Corresponds to the inline flag (?a).

这意味着:

  • \d=[0-9]-不再匹配印地语、孟加拉语等数字
  • \D=[^0-9]-并匹配ASCII数字以外的任何字符(即,它现在充当(?u)(?![0-9])\d
  • \w=[A-Za-z0-9_]-现在它只匹配ASCII字,Wiktor\w+匹配,但Виктор不匹配
  • \W=[^A-Za-z0-9_]-它匹配除ASCII字母/数字以外的任何字符/_(即,它匹配你好吗Виктор
  • \s=[ \t\n\r\f\v]-匹配常规空格、制表符、换行符、回车符、换行符和垂直制表符
  • \S=[^ \t\n\r\f\v]-匹配空格、制表符、换行符、回车符、换行符和垂直制表符以外的任何字符,因此它匹配所有Unicode字母、数字、标点符号和Unicode(非ASCII)空格。例如,re.sub(r'\S+', r'{\g<0>}', '\xA0 ', flags=re.A)将返回'{ } ',如您所见,\S现在匹配硬空格

相关问题 更多 >