- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试让 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/
我有一个加号/减号按钮,希望用户不能选择超过 20 个但不知道如何让它工作。我尝试使用 min="1"max="5 属性,但它们不起作用。这是我的代码和一个 fiddle 链接。https://jsf
我正在尝试复制顶部底部图,如示例 here但它没有正确渲染(紫色系列有 +ve 和 -ve 值,绿色为负值)留下杂乱的人工制品。我也在努力创建一个玩具示例来复制这个问题,所以我希望尽管我缺乏数据,但有
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 已关闭 6 年前。 社区去年审查了是
这个问题在这里已经有了答案: Adding two positive integers gives negative answer.Why? (4 个答案) 关闭 5 年前。 我遇到了一个奇怪的问题
有谁知道如何将字符串值类型 -4,5 或 5,4 转换为 double -4.5 或 5.4? 最佳答案 只需使用 Double.parseDouble(Locale, String); 糟糕,我很困
我正在尝试根据 TextBlob 分类插入一个仅包含“正”或“负”字符串的新数据框列:对于我的 df 的第一行,结果是 ( pos , 0.75, 0.2499999999999997)我想要' 正
我对 VBA 非常陌生,无法理解如何在一个循环中完成 2 个任务。我非常感谢您的帮助。 我已经能够根据第 3 列中的数据更改第 2 列中的数值,但我不明白如何将负值的字体更改为红色。 表格的大小每月都
欢迎, 我正在使用 jquery 通过 POST 发送表单。 这就是我获得值(value)的方式。 var mytext = $("#textareaid").val(); var dataStrin
double d = 0; // random decimal value with it's integral part within the range of Int32 and always p
我有这个字符串: var a='abc123#xyz123'; 我想构建 2 个正则表达式替换函数: 1) 用 '*' 替换所有确实有 future '#'的字符(不包括'#') 所以结果应该是这样的
我正在使用 DialogFragment。当用户从 Gmail 平板电脑应用程序的屏幕与下面示例图片中的编辑文本进行交互时,我希望正面和负面按钮保持在键盘上方。 在我的尝试中不起作用,这是我的 Dia
从组装艺术一书中,我复制了这句话: In the two’s complement system, the H.O. bit of a number is a sign bit. If the H.O
是否有更好更优雅的方法来实现下面的简单代码(diffYear、A 和 B 是数字): diffYear = yearA - yearB; if (diffYear == 0) { A = B
我正在设计一种语言,并尝试确定 true 应该是 0x01 还是 0xFF。显然,所有非零值都将转换为 true,但我正在尝试确定确切的内部表示。 每种选择的优点和缺点是什么? 最佳答案 没关系,只要
在我的 dialogfragment 类的 OnCreateDialog 中,我正在这样做: AlertDialog.Builder builder = new AlertDialog.Builder
这个问题在这里已经有了答案: Resolving ambiguous overload on function pointer and std::function for a lambda usin
我偶然发现了一个奇怪的 NSDecimalNumber 行为:对于某些值,调用 integerValue、longValue、longLongValue 等,返回意想不到的值(value)。示例: l
这个问题在这里已经有了答案: Resolving ambiguous overload on function pointer and std::function for a lambda using
我有这个正则表达式来测试用户输入是否有效: value.length === 0 || value === '-' || (!isNaN(parseFloat(value)) && /^-?\d+\.
我想用高斯混合模型拟合数据集,数据集包含大约 120k 个样本,每个样本有大约 130 个维度。当我使用 matlab 执行此操作时,我运行脚本(簇号为 1000): gm = fitgmdist(d
我是一名优秀的程序员,十分优秀!