Python 2.7 带有多个选项重音符和重音符的正则表达式语句
Python 2.7 regex statement with multiple option acute and grave accents
我正在尝试创建一个 python 正则表达式语句,该语句将使用 2 个可选字符。下面是我正在处理的基本正则表达式语句。
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
...
我遇到的问题是 ö
和 ä
都可以同时存在,and/or 既不是尖音也不是重音,所以以下任何变体,ö́
、ä́
、ö̀
、ä̀
。如果 ä
上有重音,我希望 ë
有相应的重音。我很难弄清楚如何在没有上述单个语句的所有变体的情况下执行此正则表达式语句。任何帮助是极大的赞赏!谢谢。
那……呢:
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
的第二个参数传递:然后为每个匹配项使用匹配对象调用该函数,并且必须 return 需要替换该匹配项的字符串。在这种情况下,我使用一个简单的 dict
来确定替换(虽然我认为我的对应关系有误,因为我几乎无法发现差异,但我相信你会很容易修复: -).
以下程序:
# -*- coding: utf-8 -*-
import re
def change(word):
return re.sub(ur'(ö[̀́]?:w)ä([̀́]?)', ur'ë', 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
应该如下所示:
- nö:wäy -> nö:wëy
- nö́:wä̀y -> nö́:wë̀y
- nö̀:wä́y -> nö̀:wë́y
除非我误解了你想要做什么,否则你正在寻找函数change
。
这是有效的,因为已经重音字母上的重音和锐音符表示为第二个 unicode 字符,将已经重音的字母与另一个重音组合在一起。一般来说,这种方法适用于 "decomposed" unicode 字符:它适用于 "ó:wà" 和 "ò:wá"(其中 "à" 表示为 u'a\u0300'
但它不会适用于“ó:wà”或“ò:wá”(其中“à”表示为 u'\u00e0'
)。如果您希望它适用于所有情况,则需要一本字典,例如@AlexMartelli 建议的字典. 在这种情况下,我建议在字典中包括所有重音字符的表示形式,预组合和分解。
有关详细信息,请阅读 unicode equivalence。
我正在尝试创建一个 python 正则表达式语句,该语句将使用 2 个可选字符。下面是我正在处理的基本正则表达式语句。
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
...
我遇到的问题是 ö
和 ä
都可以同时存在,and/or 既不是尖音也不是重音,所以以下任何变体,ö́
、ä́
、ö̀
、ä̀
。如果 ä
上有重音,我希望 ë
有相应的重音。我很难弄清楚如何在没有上述单个语句的所有变体的情况下执行此正则表达式语句。任何帮助是极大的赞赏!谢谢。
那……呢:
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
的第二个参数传递:然后为每个匹配项使用匹配对象调用该函数,并且必须 return 需要替换该匹配项的字符串。在这种情况下,我使用一个简单的 dict
来确定替换(虽然我认为我的对应关系有误,因为我几乎无法发现差异,但我相信你会很容易修复: -).
以下程序:
# -*- coding: utf-8 -*-
import re
def change(word):
return re.sub(ur'(ö[̀́]?:w)ä([̀́]?)', ur'ë', 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
应该如下所示:
- nö:wäy -> nö:wëy
- nö́:wä̀y -> nö́:wë̀y
- nö̀:wä́y -> nö̀:wë́y
除非我误解了你想要做什么,否则你正在寻找函数change
。
这是有效的,因为已经重音字母上的重音和锐音符表示为第二个 unicode 字符,将已经重音的字母与另一个重音组合在一起。一般来说,这种方法适用于 "decomposed" unicode 字符:它适用于 "ó:wà" 和 "ò:wá"(其中 "à" 表示为 u'a\u0300'
但它不会适用于“ó:wà”或“ò:wá”(其中“à”表示为 u'\u00e0'
)。如果您希望它适用于所有情况,则需要一本字典,例如@AlexMartelli 建议的字典. 在这种情况下,我建议在字典中包括所有重音字符的表示形式,预组合和分解。
有关详细信息,请阅读 unicode equivalence。