【问题标题】:How to account for accent characters for regex in Python?如何解释 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:请参阅下面的答案。

标签: python regex django hashtag non-ascii-characters


【解决方案1】:

尝试以下方法:

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

Regex101 Demo

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

【讨论】:

  • 小警告:\w 不会匹配组合代码点,因此aU+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']

希望这对其他人有帮助。

【讨论】:

    猜你喜欢
    • 2013-10-25
    • 2012-10-27
    • 1970-01-01
    • 2023-03-12
    • 2016-04-22
    • 1970-01-01
    • 2015-07-27
    • 2012-02-19
    • 2013-01-06
    相关资源
    最近更新 更多