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

Python正则表达式:带有re.ASCII的模式仍然可以匹配unicode字符吗?,python,regex,unicode,ascii,Python,Regex,Unicode,Ascii,我是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'你好吗' 还有结果。我想知道我在这里做错了什么?re.A标志

我是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'你好吗' 还有结果。我想知道我在这里做错了什么?

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

在Python3.x中,如果支持Unicode,则默认情况下启用。这意味着:

\d:匹配任何Unicode十进制数字,即Unicode字符类别[Nd]中的任何字符 \D:匹配任何非十进制数字的字符。因此,除中的字符以外的所有字符。 \w-匹配Unicode单词字符;这包括任何语言中可以作为单词一部分的大多数字符,以及数字和下划线。因此,\ w+匹配“我的名字是bццц”字符串中的每个单词 \W-匹配任何非单词字符的字符。这与\w相反。因此,它将不匹配任何Unicode字母或数字。 \s-匹配Unicode空白字符它将匹配NEL、硬空格等。 \S-匹配任何非空白字符的字符。因此,NEL、硬空间等都无法与之匹敌。 \b-单词边界匹配Unicode字母/数字和非字母/数字之间的位置或字符串的开始/结束。 \B-非单词边界匹配两个Unicode字母/数字之间、两个非字母/数字之间或Unicode非字母/数字与字符串开头/结尾之间的位置。 如果要禁用此行为,请使用re.A或re.ASCII:

使\w、\w、\b、\b、\d、\d、\s和\s仅执行ASCII匹配,而不是完全的Unicode匹配。这仅对Unicode模式有意义,而对字节模式则忽略。对应于内联标志?a

这意味着:

\d=[0-9]-不再匹配印地语、孟加拉语等数字 \D=[^0-9]-并匹配ASCII数字以外的任何字符,即它充当?u?![0-9]\n现在被删除 \w=[A-Za-z0-9_2;]-现在它只匹配ASCII字,Wiktor与\w+匹配,但bцццц不匹配 \W=[^A-Za-z0-9 \]-它匹配除ASCII字母/数字以外的任何字符,也就是说,它匹配你好吗, аааа等。 \s=[\t\n\r\f\v]-匹配常规空格、制表符、换行符、回车符、换行符和垂直制表符 \S=[^\t\n\r\f\v]-匹配空格、制表符、换行符、回车符、换行符和垂直制表符以外的任何字符,因此它匹配所有Unicode字母、数字和标点符号以及Unicode非ASCII空格。例如,re.subr'\S+',r'{\g}','\xA0',flags=re.A将返回'{}',正如您所看到的,\S现在匹配硬空格。 re.A标志只影响与哪些速记字符类匹配

在Python3.x中,如果支持Unicode,则默认情况下启用。这意味着:

\d:匹配任何Unicode十进制数字,即Unicode字符类别[Nd]中的任何字符 \D:匹配任何非十进制数字的字符。因此,除中的字符以外的所有字符。 \w-匹配Unicode单词字符;这包括任何语言中可以作为单词一部分的大多数字符,以及数字和下划线。因此,\ w+匹配“我的名字是bццц”字符串中的每个单词 \W-匹配任何非单词字符的字符。这与\w相反。因此,它将不匹配任何Unicode字母或数字。 \s-匹配Unicode空白字符它将匹配NEL、硬空格等。 \S-匹配任何非空白字符的字符。因此,NEL、硬空间等都无法与之匹敌。 \b-单词边界匹配Unicode字母/数字和非字母/数字之间的位置或字符串的开始/结束。 \B-非单词边界匹配两个Unicode字母/数字之间、两个非字母/数字之间或Unicode非字母/数字与字符串开头/结尾之间的位置。 如果要禁用此行为,请使用re.A或re.ASCII:

使\w、\w、\b、\b、\d、\d、\s和\s仅执行ASCII匹配,而不是完全的Unicode匹配。这仅对Unicode模式有意义,而对字节模式则忽略。对应于内联标志?a

这意味着:

\d=[0-9]-不再匹配印地语、孟加拉语等数字 \D=[^0-9]-并匹配ASCII数字以外的任何字符,即它充当?u?![0-9]\n现在被删除 \w=[A-Za-z0-9_2;]-现在它只匹配ASCII字,Wiktor与\w+匹配,但bцццц不匹配 \W=[^A-Za-z0-9 \]-它匹配除ASCII字母/数字以外的任何字符,也就是说,它匹配你好吗, аааа等。 \s=[\t\n\r\f\v]-匹配常规空格、制表符、换行符、回车符、换行符和垂直制表符 \S=[^\t\n\r\f\v]-匹配空格、制表符、换行符、回车符、换行符和垂直制表符以外的任何字符,因此它匹配所有Unicode字母、数字和标点符号以及Unicode非ASCII空格。例如,re.subr'\S+',r'{\g}','\xA0',flags=re.A将返回'{}',正如您所看到的,\S现在匹配硬空格。
您必须使用\u引用此re.ASCII不是您认为的,在
是case@NikosM. 那么这意味着什么呢?文档说如果我理解正确,它将强制ASCII模式。@jdhao仍然非空格即使在强制ASCII模式下也是非空格的,这就是你得到的,不管是unicode还是unicode,即使在强制ASCII模式下也是非空格的ascii@NikosM.N我有点明白了。在ASCII模式下,它相当于[^\t\n\r\f\v]。所以unicode字符应该匹配。谢谢您必须使用\u引用此re.ASCII不是您所认为的,在这种情况下case@NikosM. 那么这意味着什么呢?文档说如果我理解正确,它将强制ASCII模式。@jdhao仍然非空格即使在强制ASCII模式下也是非空格的,这就是你得到的,不管是unicode还是unicode,即使在强制ASCII模式下也是非空格的ascii@NikosM.N我有点明白了。在ASCII模式下,它相当于[^\t\n\r\f\v]。所以unicode字符应该匹配。谢谢