特殊字符的正则表达式(顶部有线的 S)

Regex For Special Character (S with line on top)

我试图在 Python 中编写正则表达式以用下划线替换所有非 ascii,但如果其中一个字符是“”('S'顶部的行),它添加了一个额外的 'S'... 是否也有办法解释这个字符?我相信这是一个有效的 utf-8 字符,但不是 ascii

这是代码:

import re
line = "ra*ndom wordS̄"
print(re.sub('[\W]', '_', line))

我希望它输出:

ra_ndom_word_

但我得到的是:

ra_ndom_wordS__

Python 以这种方式工作的原因是您实际上正在查看两个不同的字符;有一个 S 然后是一个组合长音符 U+0304

在一般情况下,如果您想用下划线替换一系列组合字符和基本字符,请尝试

import unicodedata

def cleanup(line):
    cleaned = []
    strip = False
    for char in line:
        if unicodedata.combining(char):
            strip = True
            continue
        if strip:
            cleaned.pop()
            strip = False
        if unicodedata.category(char) not in ("Ll", "Lu"):
            char = "_"
        cleaned.append(char)
    return ''.join(cleaned)

顺便说一下,\W 不需要方括号;它已经是一个正则表达式字符 class.

Python 的 re 模块缺少对重要 Unicode 属性的支持,但如果你真的想为此专门使用正则表达式,third-party regex 库对 Unicode 类别有适当的支持。

"Ll" 是小写字母,"Lu" 是大写字母。还有其他 Unicode L 类别,所以也许可以调整它以满足您的要求(unicodedata.category(char).startswith("L") 也许吧?);另见 https://www.fileformat.info/info/unicode/category/index.htm

您可以使用以下脚本获得所需的输出:

import re

line="ra*ndom wordS̄"
print(re.sub('[^[-~]+]*','_',line))

输出

ra_ndom_word_

在这种方法中,它也适用于其他 non-ascii 个字符:

import re

line="ra*ndom ¡¢£Ä wordS̄.  another non-ascii: Ä and Ï"
print(re.sub('[^[-~]+]*','_',line))

输出:

ra_ndom_word_another_non_ascii_and_