gpt4 book ai didi

python - 正则表达式 - 匹配一个字符及其所有变音符号(又名重音不敏感)

转载 作者:太空狗 更新时间:2023-10-29 22:10:50 27 4
gpt4 key购买 nike

我试图用正则表达式匹配一个字符及其所有可能的变音符号(又名重音不敏感)。我能做的当然是:

re.match(r"^[eēéěèȅêęëėẹẽĕȇȩę̋ḕḗḙḛḝė̄]$", "é")

但这不是一个通用的解决方案。如果我使用像 \pL 这样的 unicode 类别,我无法将匹配减少到特定字符,在本例中为 e

最佳答案

实现预期目标的解决方法是使用 unidecode首先摆脱所有变音符号,然后再次匹配常规 e

re.match(r"^e$", unidecode("é"))

或者在这个简化的例子中

unidecode("é") == "e"

另一种不依赖于 unidecode 库、保留 unicode 并提供更多控制的解决方案是手动删除变音符号,如下所示:

使用unicodedata.normalize()将您的输入字符串转换为正常形式 D(用于分解),确保像 é 这样的复合字符被转换为分解形式 e\u301(e + COMBINING ACUTE ACCENT)

>>> input = "Héllô"
>>> input
'Héllô'
>>> normalized = unicodedata.normalize("NFKD", input)
>>> normalized
'He\u0301llo\u0302'

然后,删除所有属于 Mark, Nonspacing 类别的代码点(简称 Mn)。这些都是本身没有宽度的字符,只是装饰前一个字符。使用 unicodedata.category()来确定类别。

>>> stripped = "".join(c for c in normalized if unicodedata.category(c) != "Mn")
>>> stripped
'Hello'

结果可以用作正则表达式匹配的来源,就像上面的 unidecode 示例一样。这是一个函数的全部内容:

def remove_diacritics(text):
"""
Returns a string with all diacritics (aka non-spacing marks) removed.
For example "Héllô" will become "Hello".
Useful for comparing strings in an accent-insensitive fashion.
"""
normalized = unicodedata.normalize("NFKD", text)
return "".join(c for c in normalized if unicodedata.category(c) != "Mn")

关于python - 正则表达式 - 匹配一个字符及其所有变音符号(又名重音不敏感),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35783135/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com