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

检测正则表达式中的拉丁字符

  •  3
  • Minions  · 技术社区  · 7 年前

    我想在拉丁语文本上应用正则表达式,我遵循了这个问题的解决方案: How to account for accent characters for regex in Python? ,建议在正则表达式之前添加#字符。

    def clean_str(string):
        string = re.sub(r"#(@[a-zA-Z_0-9]+)", " ", string, re.UNICODE)
        string = re.sub(r'#([^a-zA-Z0-9#])', r' \1 ', string, re.UNICODE)
        string = re.sub(r'#([^a-zA-Z0-9#])', r' ', string, re.UNICODE)
        string = re.sub(r'(\s{2,})', ' ', string, re.UNICODE)
        return string.lower().strip()
    

    我的问题是,正则表达式可以检测拉丁字符,但没有从文本的正则表达式集中应用任何东西。

    示例: 如果我有一个像“@aaa bbb cc.ddd”这样的文本。

    它应该像“bbb cc.ddd”,在“点”之前加上空格,并删除标记“@aaa”。

    但它会生成相同的输入文本!:“@aaa bbb cÃc.ddd”

    我错过什么了吗?

    1 回复  |  直到 5 年前
        1
  •  1
  •   Wiktor Stribiżew    7 年前

    当前代码中有几个问题:

    • 要匹配任何Unicode单词char,请使用 \w (而不是 [A-Za-z0-9_] )使用Unicode标志
    • 使用时 re.U 具有 re.sub ,请记住使用 计数 参数(将其设置为0以匹配所有事件),或仅使用 flags=re.U / flags=re.UNICODE
    • 要匹配除空格以外的任何非单词字符,可以使用 [^\w\s]
    • 如果要替换为整个匹配,则不必使用 (...) ,只需确保使用 \g<0> 替换模式中的反向引用。

    请参阅清理字符串的更新方法:

    >>> def clean_str(s):
    ...     s = re.sub(r'@\w+', ' ', s, flags=re.U)
    ...     s = re.sub(r'[^\w\s]', r' \g<0>', s, flags=re.U)
    ...     s = re.sub(r'\s{2,}', ' ', s, flags=re.U)
    ...     return s.lower().strip()
    ...
    >>> print(clean_str(s))
    puta asquerosa cállate . sino