在python 3中,我希望能够以"不敏感"的方式使用 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中喝X x"(请注意,"Chloë"上仍然有一个重音(,而不是"是80°C,我在喝酒x在咖啡馆里与Chloë。">
我认为这样的标志不存在。那么,最好的选择是什么?在original_text
和accent_regex
上都使用re.finditer
和unidecode
,然后通过拆分字符串替换?或通过其重音变体修改accent_regex
中的所有字符,例如: r'[cç][aàâ]f[éèêë]'
?
unidecode
通常用于删除python中的口音,但它的作用远不止于此:它将 '°'
转换为 'deg'
,这可能不是所需的输出。
unicodedata
似乎具有足够的功能来消除口音。
有任何模式
此方法应适用于任何模式和任何文本。
您可以暂时从文本和Regex模式中删除口音。re.finditer()
(启动和最终索引(的匹配信息可用于修改原始的,重音文本。
请注意,必须逆转匹配项才能不修改以下索引。
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
- 如果它不匹配,请留下单词不变
- 如果匹配,请替换为
import re
from unidecode import unidecode
original_text = "I'm drinking a café in a cafe with Chloë."
def remove_accents(string):
return unidecode(string)
accented_words = ['café', 'français']
words_to_remove = set(remove_accents(word) for word in accented_words)
def remove_words(matchobj):
word = matchobj.group(0)
if remove_accents(word) in words_to_remove:
return 'X'
else:
return word
print(re.sub('w+', remove_words, original_text))
# I'm drinking a X in a X with Chloë.
您可以使用unidecode:
$ pip install unidecode
在您的程序中:
from unidecode import unidecode
original_text = "I'm drinking a café in a cafe."
unidecoded_text = unidecode(original_text)
regex = r'cafe'
re.sub(regex, 'X', unidecoded_text)
而不是删除口音,我需要保留文本上的口音,然后我使用以下代码:
accents_dic = {
'A': '(A|Á|À|Â|Ã)',
'E': '(E|É|È)',
'I': '(I|Í|Ï)',
'O': '(O|Ó|Ô|Õ|Ö)',
'U': '(U|Ú|Ü)',
'C': '(C|Ç)'
}
def define_regex_name(name):
for i, j in accents_dic.items():
name = re.sub(i,j,name)
return re.compile(name, re.IGNORECASE)