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

问题描述 投票:0回答:6

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

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

它搜索 str1 并找到所有主题标签。这是可行的,但它不能解释像这样的重音字符,例如:

áéíóúñü¿

如果这些字母之一在 str1 中,它将保存主题标签,直到其前面的字母为止。例如,

#yogenfrüz
将是
#yogenfr

我需要能够解释德语、荷兰语、法语和西班牙语中的所有重音字母,以便我可以保存诸如

#yogenfrüz

之类的主题标签

我该如何做这件事

python regex django hashtag non-ascii-characters
6个回答
35
投票

尝试以下操作:

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

Regex101 演示

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


21
投票

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

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

将会返回

['#yogenfrüz']

希望这对其他人有帮助。


6
投票

您可能还想使用

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

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

导入unicode数据 输出 = unicodedata.normalize('NFD', my_unicode).encode('ascii', '忽略') 明确的例子...

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

检查这个答案它对我帮助很大:如何将unicode重音字符转换为不带重音的纯ascii?


0
投票

这是 Ibrahim Najjar 原始答案的更新,基于 Martijn Pieters 对答案的评论以及 Martijn Pieters 在 https://stackoverflow.com/a/16467505/5302861 中给出的另一个答案

import re
import unicodedata

s = "#ábá123"
n = unicodedata.normalize('NFC', s)

print(n)
c = ''.join(re.findall(r'#\w+', n, re.UNICODE))
print(s, len(s), c, len(c))

0
投票

建立在所有其他答案的基础上:

关键问题是 re 模块与其他正则表达式引擎有很大不同。理论上,Unicode 对

\w
元字符的定义可以满足问题的要求,但是 re 模块没有实现 Unicode 的
\w
元字符。

简单的解决方案是更换正则表达式引擎,使用更兼容的解决方案。最简单的方法是安装 regex 模块并使用它。其他一些答案给出的代码将根据问题需要工作。

import regex as re
# import unicodedata as ud
import unicodedataplus as ud
hashtags = re.findall(r'#(\w+)', ud.normalize("NFC",str1))

或者,如果您只关注拉丁字母,包括非空格标记(即组合变音符号):

import regex as re
# import unicodedata as ud
import unicodedataplus as ud
hashtags = re.findall(r'#([\p{Latin}\p{Mn}]+)', ud.normalize("NFC",str1))

附注我使用了 unicodedataplus,它是 unicodedata 的直接替代品。它有额外的方法,并且与 Unicode 版本保持同步。使用 unicodedata 模块更新 Unicode 版本需要更新 Python。


0
投票

这个(从 #21 Zanga 复制粘贴)并没有那么糟糕,除了......当你必须输入 À 和 ÿ (这不是很方便) 主题标签 = re.findall(r'#([A-Za-z0-9_À-ÿ]+)', str1)

然后相同,但使用 unicode 范围 hashtags = re.findall(r'#([A-Za-z0-9\u00OC-\u00FF]+)', str1) 女巫真的更容易打字

有一个带小数范围的解决方案,但我不记得了

© www.soinside.com 2019 - 2024. All rights reserved.