我目前使用 re.findall 来查找和隔离字符串中哈希标签的“#”字符之后的单词:
hashtags = re.findall(r'#([A-Za-z0-9_]+)', str1)
它搜索 str1 并找到所有主题标签。这是可行的,但它不能解释像这样的重音字符,例如:
áéíóúñü¿
。
如果这些字母之一在 str1 中,它将保存主题标签,直到其前面的字母为止。例如,
#yogenfrüz
将是 #yogenfr
。
我需要能够解释德语、荷兰语、法语和西班牙语中的所有重音字母,以便我可以保存诸如
#yogenfrüz
之类的主题标签
我该如何做这件事
尝试以下操作:
hashtags = re.findall(r'#(\w+)', str1, re.UNICODE)
编辑 查看下面来自 Martijn Pieters 的有用评论。
我知道这个问题有点过时,但您也可以考虑将重音字符 À(索引 192)和 ÿ(索引 255)的范围添加到原始正则表达式中。
hashtags = re.findall(r'#([A-Za-z0-9_À-ÿ]+)', str1)
将会返回
['#yogenfrüz']
希望这对其他人有帮助。
您可能还想使用
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?
这是 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))
建立在所有其他答案的基础上:
关键问题是 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。
这个(从 #21 Zanga 复制粘贴)并没有那么糟糕,除了......当你必须输入 À 和 ÿ (这不是很方便) 主题标签 = re.findall(r'#([A-Za-z0-9_À-ÿ]+)', str1)
然后相同,但使用 unicode 范围 hashtags = re.findall(r'#([A-Za-z0-9\u00OC-\u00FF]+)', str1) 女巫真的更容易打字
有一个带小数范围的解决方案,但我不记得了