python中不区分重音替换的Regex

2024-06-16 09:47:34 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python3中,我希望能够以“不区分重音”的方式使用re.sub(),就像我们可以用re.I标志来进行不区分大小写的替换一样。在

可能是re.IGNOREACCENTS标志:

original_text = "¿It's 80°C, I'm drinking a café in a cafe with Chloë。"
accent_regex = r'a café'
re.sub(accent_regex, 'X', original_text, flags=re.IGNOREACCENTS)

这会导致“这是80°C,我在X和Chloë一起喝X”(注意“Chloë”仍然有重音)而不是“It's 80°C,I'm dring X in a cafe with Chloë”用的是真正的python。在

我认为没有这样的旗帜。那么,最好的选择是什么呢?在original_text和{}上同时使用re.finditer和{},然后通过拆分字符串来替换?或者通过重音变体修改accent_regex中的所有字符,例如:r'[cç][aàâ]f[éèêë]'?在


Tags: textinrecafe标志withitregex
2条回答

在Python中,^{}经常被用来删除重音符号,但它的作用还不止于此:它将'°'转换为'deg',这可能不是期望的输出。在

^{}似乎有{a3}。在

有任何图案

此方法应适用于任何模式和任何文本。在

您可以暂时删除文本和正则表达式模式中的重音符号。来自^{}(起始和结束索引)的匹配信息可用于修改原始的重音文本。在

请注意,为了不修改以下索引,必须反转匹配项。在

import re
import unicodedata

original_text = "I'm drinking a 80° café in a cafe with Chloë, François Déporte and Francois Deporte."

accented_pattern = r'a café|François Déporte'

def remove_accents(s):
    return ''.join((c for c in unicodedata.normalize('NFD', s) if unicodedata.category(c) != 'Mn'))

print(remove_accents('äöüßéèiìììíàáç'))
# aoußeeiiiiiaac

pattern = re.compile(remove_accents(accented_pattern))

modified_text = original_text
matches = list(re.finditer(pattern, remove_accents(original_text)))

for match in matches[::-1]:
    modified_text = modified_text[:match.start()] + 'X' + modified_text[match.end():]

print(modified_text)
# I'm drinking a 80° café in X with Chloë, X and X.

如果模式是一个词或一组词

你可以:

  • 删除模式词中的重音符号,并将其保存在一个集合中以便快速查找
  • \w+查找文本中的每个单词
  • 删除单词中的重音符号:
    • 如果匹配,则替换为X
    • 如果不匹配,请保留该单词不变

^{pr2}$

您可以使用Unidecode

$ pip install unidecode

在您的计划中:

^{pr2}$

相关问题 更多 >