簡體   English   中英

Python 正則表達式:帶有 re.ASCII 的模式仍然可以匹配 unicode 字符?

[英]Python regex: pattern with re.ASCII can still match unicode characters?

我是 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標志只影響速記字符類匹配的內容。

In Python 3.x, shorthand character classes are Unicode aware, the Python 2.x re.UNICODE / re.U is ON by default. 這意味着:

  • \d匹配任何 Unicode 十進制數字(即 Unicode 字符類別[Nd]中的任何字符)
  • \D匹配任何不是十進制數字的字符。 (因此,除Nd Unicode 類別中的字符之外的所有字符)。
  • \w -匹配 Unicode 字字符; 這包括可以成為任何語言中單詞一部分的大多數字符,以及數字和下划線。 (所以, \w+匹配My name is Виктор字符串中的每個單詞)
  • \W -匹配任何不是單詞字符的字符。 這與\w相反。 (因此,它不會匹配任何 Unicode 字母或數字。)
  • \s -匹配 Unicode 空白字符(它將匹配NEL 、硬空格等)
  • \S -匹配任何不是空白字符的字符。 (因此,不匹配NEL 、硬空間等)
  • \b - 字邊界匹配 Unicode 字母/數字和非字母/數字或字符串的開頭/結尾之間的位置。
  • \B - 非單詞邊界匹配兩個 Unicode 字母/數字、兩個非字母/數字之間或 Unicode 非字母/數字和字符串開頭/結尾之間的位置。

如果要禁用此行為,請使用re.Are.ASCII

使\w\W\b\B\d\D\s\S執行僅 ASCII 匹配,而不是完整的 Unicode 匹配。 這僅對 Unicode 模式有意義,對於字節模式將被忽略。 對應於內聯標志(?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現在匹配硬空間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM