我试图创建一个可以使用2个可选字符的python正则表达式语句。以下是我工作的基本正则表达式。
word = re.sub(ur'ö:wä', ur'ö:wë', word) #change the a to e
word = re.sub(ur'ö́:wä̀', ur'ö́:wë̀', word) # both acute accents
word = re.sub(ur'ö̀:wä́', ur'ö̀:wë́', word) # ö has grave accent and ä has acute
...
我遇到的问题是,ö
和ä
都可以同时具有和/或不具有强调重音或严重重音,因此以下任何变体{{1} },ö́
,ä́
,ö̀
。如果ä̀
上有重音,我希望ä
具有相应的重音。我很难在没有上面单个语句的所有变体的情况下弄清楚如何执行此正则表达式语句。任何帮助是极大的赞赏!感谢。
答案 0 :(得分:1)
怎么样......:
a2e = {u'ä':u'ë̀', u'ä̀':u'ë́', u'ä́':u'ë'} # or whatever
def match_accents(mo):
s = mo.group(0)
return s[:-1] + a2e[s[-1]]
word = re.sub(ur'[öö́ö̀]:w[ää̀ä́]', match_accents, word) # change the a to e
关键的想法是你可以传递一个函数作为sub
的第二个参数:然后用每个匹配的match-object调用该函数,并且必须返回一个字符串哪个匹配需要更换。在这种情况下,我使用一个简单的dict
来确定替换(虽然我认为我的通信错误,因为我几乎无法发现差异,我相信你很容易修复: - 。)
答案 1 :(得分:0)
以下计划:
# -*- coding: utf-8 -*-
import re
def change(word):
return re.sub(ur'(ö[̀́]?:w)ä([̀́]?)', ur'\1ë\2', word)
for word in [u'nö:wäy', u'nö́:wä̀y', u'nö̀:wä́y']:
print word, "->", change(word)
打印:
nö:wäy -> nö:wëy
nö́:wä̀y -> nö́:wë̀y
nö̀:wä́y -> nö̀:wë́y
应该是这样的:
除非我误解了你想做什么,否则你正在寻找功能change
。
这是有效的,因为已经重音的字母上的严重和急性重音被表示为第二个unicode字符,将已经重音的字母与一个重音组合在一起。一般来说,这种方法适用于“分解”的unicode字符:它适用于“ó:wà”和“ò:wá”(其中“à”表示为u'a\u0300'
但它不适用于“ó” :wà“或”ò:wá“(其中”à“表示为u'\u00e0'
)。如果你希望它适用于所有情况,你需要一个字典,如@AlexMartelli建议的字典。在这种情况下。 ,我建议在字典中包括重音字符的所有表示,预先组合和分解。
有关详细信息,请参阅unicode equivalence。