如何解释 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 中正则表达式的重音字符?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用正则表达式避免在 unicode 重音后大写字母 [重复]
使用正则表达式剥离字符失败,使用带有变音符号,撇号,重音符号等的文字字符