代码之家  ›  专栏  ›  技术社区  ›  deadlock

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

  •  30
  • deadlock  · 技术社区  · 11 年前

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

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

    它搜索str1并找到所有的标签。这是有效的,但它不考虑像以下这样的重音字符: áéíóúñü¿ .

    如果这些字母中有一个在str1中,它将保存标签,直到它前面的字母为止, #yogenfrüz 将是 #yogenfr .

    我需要能够解释所有重音字母,包括德语、荷兰语、法语和西班牙语,这样我就可以保存这样的标签 #约根弗兹

    我该怎么做

    5 回复  |  直到 11 年前
        1
  •  33
  •   Ibrahim Najjar    8 年前

    请尝试以下操作:

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

    Regex101 Demo

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

        2
  •  16
  •   zanga    4 年前

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

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

    哪个会回来 ['yogenfrüz']

    希望这能帮助到其他人。

        3
  •  4
  •   Community CDub    8 年前

    您可能还想使用

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

    如何将所有这些转义字符转换为它们各自的字符,就像如果有unicode一样,如何将其转换为标准的a? 假设您已经将unicode加载到一个名为my_unicode的变量中。。。标准化为a就是这么简单。。。

    导入unicodedata output=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?

        4
  •  0
  •   Shabbir Khan    2 年前

    以下是根据Martijn Pieters对答案的评论和Martijn Peters给出的另一个答案对Ibrahim Najjar的原始答案的更新 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))
    
        5
  •  0
  •   Andj    2 年前

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

    关键问题是re模块与其他正则表达式引擎在很大程度上不同。理论上,Unicode对 \w 元字符可以满足问题的要求,但re模块不实现Unicode的 \周 元字符。

    简单的解决方案是交换正则表达式引擎,使用更兼容的解决方案。最简单的方法是安装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。