Python的治疗为\ uXXXX作为字符串字面内部Unicode字符转义(如U“\ u2014”被解释为Unicode字符U + 2014)。 但我刚发现(Python 2.7版),该标准正则表达式模块不把为\ uXXXX作为一个Unicode字符。 例:
codepoint = 2014 # Say I got this dynamically from somewhere
test = u"This string ends with \u2014"
pattern = r"\u%s$" % codepoint
assert(pattern[-5:] == "2014$") # Ends with an escape sequence for U+2014
assert(re.search(pattern, test) != None) # Failure -- No match (bad)
assert(re.search(pattern, "u2014")!= None) # Success -- This matches (bad)
显然,如果你可以指定你的正则表达式作为一个字符串,那么你可以有同样的效果,如果正则表达式引擎本身理解为\ uXXXX转义:
test = u"This string ends with \u2014"
pattern = u"\u2014$"
assert(pattern[:-1] == u"\u2014") # Ends with actual unicode char U+2014
assert(re.search(pattern, test) != None)
但是,如果你需要什么动态构建您的模式?
使用unichr()
函数来创建一个代码点Unicode字符:
pattern = u"%s$" % unichr(codepoint)
一种可能性是,而不是重新调用方法直接,包起来的东西,可以理解带有\ U逃逸代表他们。 事情是这样的:
def my_re_search(pattern, s):
return re.search(unicode_unescape(pattern), s)
def unicode_unescape(s):
"""
Turn \uxxxx escapes into actual unicode characters
"""
def unescape_one_match(matchObj):
escape_seq = matchObj.group(0)
return escape_seq.decode('unicode_escape')
return re.sub(r"\\u[0-9a-fA-F]{4}", unescape_one_match, s)
它例如工作:
pat = r"C:\\.*\u20ac" # U+20ac is the euro sign
>>> print pat
C:\\.*\u20ac
path = ur"C:\reports\twenty\u20acplan.txt"
>>> print path
C:\reports\twenty€plan.txt
# Underlying re.search method fails to find a match
>>> re.search(pat, path) != None
False
# Vs this:
>>> my_re_search(pat, path) != None
True
由于流程中的字符串的转义序列在Python用于指出了解码(“unicode_escape”)的想法。
但请注意,你不能仅仅通过解码(“unicode_escape”)把你的整个格局。 它将工作在某些时候(因为当你把前面一个反斜杠最正则表达式的特殊字符不改变自己的意思),但它不是一般的工作。 例如,这里使用的解码(“unicode_escape”)改变了正则表达式的含义:
pat = r"C:\\.*\u20ac" # U+20ac is the euro sign
>>> print pat
C:\\.*\u20ac # Asks for a literal backslash
pat_revised = pat.decode("unicode_escape")
>>> print pat_revised
C:\.*€ # Asks for a literal period (without a backslash)
文章来源: Does python re (regex) have an alternative to \\u unicode escape sequences?