gpt4 book ai didi

python - regex.sub() 给出与 re.sub() 不同的结果

转载 作者:太空狗 更新时间:2023-10-29 17:14:36 25 4
gpt4 key购买 nike

我与 Czech 一起工作Python 3.4 中的重音文本。

调用 re.sub()用正则表达式对重音句子进行替换效果很好,但使用用 re.compile() 编译的正则表达式然后调用regex.sub()失败。

在这种情况下,我对 re.sub() 使用相同的参数和 regex.sub()

import re

pattern = r'(?<!\*)(Poplatn[ií]\w+ da[nň]\w+)'
flags = re.I|re.L
compiled = re.compile(pattern, flags)
text = 'Poplatníkem daně z pozemků je vlastník pozemku'
mark = r'**\1**' # wrap 1st matching group in double stars

print(re.sub(pattern, mark, text, flags))
# outputs: **Poplatníkem daně** z pozemků je vlastník pozemku
# substitution works

print(compiled.sub(mark, text))
# outputs: Poplatníkem daně z pozemků je vlastník pozemku
# substitution fails

我相信原因是重音,因为对于一个没有重音的句子 re.sub()regex.sub()工作相同。

但在我看来这像是一个错误,因为传递相同的参数会返回不同的结果,这是不应该发生的。本主题因不同的平台和语言环境而变得复杂,因此它可能无法在您的系统上重现。这是我的控制台的屏幕截图。

Python console

您是否发现我的代码有任何错误,或者我应该将其报告为错误?

最佳答案

作为Padraic Cunningham figured out ,这实际上不是错误。

但是,它您没有遇到的错误有关,并且您使用了您可能不应该使用的标志,所以我将在下面留下我之前的回答,即使他是您问题的正确答案。


有一个最近的变化(介于 3.4.1 和 3.4.3 之间,以及介于 2.7.3 和 2.7.8 之间)影响了这一点。在此更改之前,您甚至无法在不引发 OverflowError 的情况下编译该模式。

更重要的是,你为什么要使用 re.Lre.L 机制并不意味着“为我的语言环境使用 Unicode 规则”,它意味着“使用一些未指定的非 Unicode 规则,这些规则只对 Latin-1 派生的语言环境有意义,可能不会在 Windows 上工作”。或者,作为 the docs把它:

Make \w, \W, \b, \B, \s and \S dependent on the current locale. The use of this flag is discouraged as the locale mechanism is very unreliable, and it only handles one “culture” at a time anyway; you should use Unicode matching instead, which is the default in Python 3 for Unicode (str) patterns.

参见 bug #22407以及链接的 python-dev 线程,用于最近对此的一些讨论。

如果我删除 re.L 标志,代码现在可以在 3.4.1 上正常编译。 (我在 3.4.1 和 3.4.3 上也得到了“正确”的结果,但这只是一个巧合;我现在故意不通过 screwy flag 并在第一个版本中搞砸了,而且仍然不小心没有通过扭曲的标志并在第二个把它搞砸了,所以他们匹配......)

因此,即使这是一个错误,它也很有可能会被 WONTFIX 关闭。 #22407 的决议是在 3.5 中针对非 bytes 模式弃用 re.L 并在 3.6 中将其删除,所以我怀疑有人会关心用它修复错误现在。 (更不用说 re 本身在理论上是支持 regex 这几十年之一......和 ​​IIRC,regex 也弃用了 L 标记,除非您使用的是 bytes 模式和 re 兼容模式。)

关于python - regex.sub() 给出与 re.sub() 不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29602177/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com