相同的 Python 和 PCRE 正则表达式对于相同的输入给出不同的输出

问题描述 投票:0回答:1

我正在尝试在

zig
中实现 minbpe 库,使用 PCRE 库上的包装器。

Python 中的模式是

r"""'(?:[sdmt]|ll|ve|re)| ?\p{L}+| ?\p{N}+| ?[^\s\p{L}\p{N}]+|\s+(?!\S)|\s+"""

当我使用带有 UTF-8 编码文本(如

abcdeparallel १२४
)的模式时,我得到以下输出:

>>> import regex as re
>>> p = re.compile(r"""'(?:[sdmt]|ll|ve|re)| ?\p{L}+| ?\p{N}+| ?[^\s\p{L}\p{N}]+|\s+(?!\S)|\s+""")
>>> p
regex.Regex("'(?:[sdmt]|ll|ve|re)| ?\\p{L}+| ?\\p{N}+| ?[^\\s\\p{L}\\p{N}]+|\\s+(?!\\S)|\\s+", flags=regex.V0)
>>> p.findall("abcdeparallel १२४")
['abcdeparallel', ' १२४']

看起来这在 PCRE 风格的正则表达式中也或多或少是相同的,我只需在末尾添加一个

/g
标志即可进行 UTF-8 匹配

但是,当我尝试通过 macOS 上的 pcre2test 工具将该模式与 pcre 一起使用时,我得到了截然不同的输出

$ pcre2test -8
PCRE2 version 10.42 2022-12-11
  re> /'(?:[sdmt]|ll|ve|re)| ?\p{L}+| ?\p{N}+| ?[^\s\p{L}\p{N}]+|\s+(?!\S)|\s+/g
data> abcdeparallel १२४
 0: abcdeparallel
 0:  \xe0
 0: \xa5\xa7
 0: \xe0
 0: \xa5\xa8
 0: \xe0
 0: \xa5
 0: \xaa

不知何故,印地语数字 (1, 2 4) 的代码点似乎有不同的解释,并且输出被匹配为完全不同的字符集

>>> "\xe0\xa5\xa7\xe0\xa5\xa8"
'१२'

是否有一个标志或我缺少的东西必须传递才能与Python中的

regex
包/模块具有相同的行为?当 UTF-8 代码点被解码为字节时,库不知道如何将它们重新组合成相同的代码点吗?

python regex pcre pcre2
1个回答
0
投票

您只需要使用 UTF-8 解码字节,而不是将它们视为字符串。

>>> "\xe0\xa5\xa7\xe0\xa5\xa8"
'१२'
>>> b"\xe0\xa5\xa7\xe0\xa5\xa8".decode('utf-8')
'१२'
© www.soinside.com 2019 - 2024. All rights reserved.