如何解释 Python 中正则表达式的重音字符?

Posted

技术标签:

【中文标题】如何解释 Python 中正则表达式的重音字符?【英文标题】:How to account for accent characters for regex in Python? 【发布时间】:2013-09-10 21:36:32 【问题描述】:

我目前使用 re.findall 来查找和隔离字符串中哈希标签的“#”字符之后的单词:

hashtags = re.findall(r'#([A-Za-z0-9_]+)', str1)

它搜索 str1 并找到所有主题标签。这可行,但它不考虑像这样的重音字符,例如:áéíóúñü¿

如果这些字母中的一个在 str1 中,它将保存主题标签直到它之前的字母。例如,#yogenfrüz 将是 #yogenfr

我需要能够解释从德语、荷兰语、法语和西班牙语范围内的所有重音字母,以便我可以保存像 #yogenfrüz 这样的主题标签

我该怎么做呢

【问题讨论】:

使用re.UNICODE 标志。 @AshwiniChaudhary:UNICODE 标志不会使使用的范围匹配非 ASCII 字符,不。如果你告诉正则表达式匹配a-z,它会采用文字范围,而不是aá 在某种程度上是同一件事的人类解释。 @MartijnPieters:那么,它会怎么做呢? ;-) @JohnTortugo:请参阅下面的答案。 【参考方案1】:

尝试以下方法:

hashtags = re.findall(r'#(\w+)', str1, re.UNICODE)

Regex101 Demo

编辑 查看下面来自 Martijn Pieters 的有用评论。

【讨论】:

小警告:\w 不会匹配组合代码点,因此a 和 U+0301 COMBINING ACUTE ACCENT 不会匹配,即使 打印á .您可能需要先标准化为 NFC。 @MartijnPieters 感谢分享,总有一些额外的东西要学。 @IbrahimNajjar 你能在你的解决方案中实施 Martijn Pieters 提到的修复吗?谢谢。 @RobertValencia 除非您真的遇到他描述的情况,否则我的解决方案仍然适用于重音字符。老实说,我不是 Unicode 专家,也不知道确切的细节,但如果你想像他建议的那样进行标准化,那么请检查这个问题的另一个答案。希望有帮助 我明白了。谢谢@IbrahimNajjar【参考方案2】:

您可能还想使用

import unicodedata
output = unicodedata.normalize('NFD', my_unicode).encode('ascii', 'ignore')

我如何将所有这些转义字符转换为它们各自的字符,例如如果有 unicode à,我如何将其转换为标准 a? 假设您已将 unicode 加载到名为 my_unicode 的变量中...将 à 规范化为 a 就是这样简单...

导入 unicodedata 输出 = unicodedata.normalize('NFD', my_unicode).encode('ascii', 'ignore') 显式示例...

myfoo = u'àà'
myfoo
u'\xe0\xe0'
unicodedata.normalize('NFD', myfoo).encode('ascii', 'ignore')
'aa'

检查这个答案对我有很大帮助:How to convert unicode accented characters to pure ascii without accents?

【讨论】:

很好的答案!肯定有人会觉得这很有用!【参考方案3】:

我知道这个问题有点过时,但您也可以考虑将重音字符范围 À(索引 192)和 ÿ(索引 255)添加到原始正则表达式中。

hashtags = re.findall(r'#([A-Za-z0-9_À-ÿ]+)', str1)

这将返回['yogenfrüz']

希望这对其他人有帮助。

【讨论】:

以上是关于如何解释 Python 中正则表达式的重音字符?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Javascript 正则表达式匹配重音字符

如何使用正则表达式避免在 unicode 重音后大写字母 [重复]

使用正则表达式剥离字符失败,使用带有变音符号,撇号,重音符号等的文字字符

如何去除重音符号并将字母变成“普通”的 ASCII 字符? [复制]

用于输入验证的正则表达式白名单 - 不区分重音

如何将重音字符与 PHP preg 匹配?