gpt4 book ai didi

Python正则表达式子函数与匹配组

转载 作者:行者123 更新时间:2023-12-01 05:28:21 25 4
gpt4 key购买 nike

我正在尝试让 python 正则表达式子函数正常工作,但遇到了一些麻烦。下面是我正在使用的代码。

 string = 'á:tdfrec'
newString = re.sub(ur"([aeioäëöáéíóàèìò])([aeioäëöáéíóúàèìò]):", ur"\1:\2", string)
#newString = re.sub(ur"([a|e|i|o|ä|ë|ö|á|é|í|ó|à|è|ì|ò])([a|e|i|o|ä|ë|ö|á|é|í|ó|ú|à|è|ì|ò]):", ur"\1:\2", string)
print newString
# a:́tdfrec is printed

所以上面的代码没有按照我想要的方式工作。它显示不正确,但打印的字符串在 : 上有精确的重音。正则表达式语句将重音符号从 a 移到 : 上。对于我声明的字符串,不应该应用此正则表达式。我对此正则表达式语句的意图是仅适用于以下示例:

 aä:dtcbd becomes a:ädtcbd
adfseì:gh becomes adfse:ìgh
éò:fdbh becomes é:òfdbh

但是我的正则表达式语句正在被应用,但我不希望它被应用。我认为我的问题是第二个字符集后跟 : (即 á:)是导致应用正则表达式语句的原因。我已经盯着这个有一段时间了,并尝试了其他一些东西,我觉得这应该有效,但我错过了一些东西。如有任何帮助,我们将不胜感激!

以下带有 re.UNICODE 标志的代码也无法实现所需的输出:

>>> import re
>>> original = u'á:tdfrec'
>>> pattern = re.compile(ur"([aeioäëöáéíóàèìò])([aeioäëöáéíóúàèìò]):", re.UNICODE)
>>> print pattern.sub(ur'\1:\2', string)
á:tdfrec

是因为变音符号和 tony the pony例如les Misérable?颠倒后变音符号位于错误的字符上:

>>> original = u'les misérable'
>>> print ''.join([i for i in reversed(original)])
elbarésim sel

最佳答案

编辑:绝对是组合变音符号的问题,您需要规范化正则表达式和您要匹配的字符串。例如:

import unicodedata

regex = unicodedata.normalize('NFC', ur'([aeioäëöáéíóàèìò])([aeioäëöáéíóúàèìò]):')
string = unicodedata.normalize('NFC', u'aä:dtcbd')
newString = re.sub(regex, ur'\1:\2', string)

下面的示例说明了为什么您可能会在没有标准化的情况下遇到问题。字符串 u'á' 可以是单个代码点 LATIN SMALL LETTER A with ACCUTE (U+00E1),也可以是两个代码点,LATIN SMALL LETTER A (U+0061) 后跟结合锐利口音 (U+0301)。这些可能看起来相同,但它们在正则表达式中会有非常不同的行为,因为您可以将组合重音作为其自己的字符进行匹配。这就是字符串 'á:tdfrec' 所发生的情况,常规“a”在组 1 中捕获,组合变音符号在组 2 中捕获。

通过规范化正则表达式和您匹配的字符串,可以确保这种情况不会发生,因为 NFC 规范化会将变音符号及其前面的字符替换为单个等效字符。

原始答案如下。

<小时/>

我认为您的问题是您尝试替换的字符串是字节字符串,而不是 Unicode 字符串。

如果这些是字符串文字,请确保您使用的是 u 前缀,例如字符串 = u'aä:dtcbd'。如果它们不是文字,您将需要对其进行解码,例如string = string.decode('utf-8')(尽管您可能需要使用不同的编解码器)。

你或许也应该normalize your string ,因为部分问题可能与组合变音符号有关。

请注意,在本例中 re.UNICODE flag 不会产生任何影响,因为它只会改变字符类简写的含义,例如 \w\d。这里重要的是,如果您使用 Unicode 正则表达式,它可能应该应用于 Unicode 字符串。

关于Python正则表达式子函数与匹配组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20891633/

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