2016-11-16 81 views
0

我有一个用户定义的字符串。 我想用它在小改进的正则表达式:由三个撇号而不是一个。 例如,在Python中转义正则表达式unicode字符串

APOSTROPHES = re.escape('\'\u2019\u02bc') 
word = re.escape("п'ять") 
word = ''.join([s if s not in APOSTROPHES else '[%s]' % APOSTROPHES for s in word]) 

它的工作原理很好的拉丁,但对Unicode的列表理解给出了以下字符串: "[\\'\\\\u2019\\\\u02bc]\xd0[\\'\\\\u2019\\\\u02bc]\xbf[\\'\\\\u2019\\\\u02bc][\\'\\\\u2019\\\\u02bc][\\'\\\\u2019\\\\u02bc]\xd1[\\'\\\\u2019\\\\u02bc]\x8f[\\'\\\\u2019\\\\u02bc]\xd1[\\'\\\\u2019\\\\u02bc]\x82[\\'\\\\u2019\\\\u02bc]\xd1[\\'\\\\u2019\\\\u02bc]\x8c"

看起来它发现两个字符串中的反斜杠,然后替换撇号

而且,print(list(w for w in APOSTROPHES))给出['\\', "'", '\\', '\\', 'u', '2', '0', '1', '9', '\\', '\\', 'u', '0', '2', 'b', 'c']

我该如何避免它?我想"\п[\'\u2019\u02bc]\я\т\ь"

+0

为什么不在'应用're.escape'后用'['\\ u2019 \\ u02bc]'*替换'''''? –

回答

2

我的理解是:您想创建一个正则表达式,可以用任何撇号匹配一个给定的词:

匹配任何撇号可以在组中定义的正则表达式:

APOSTROPHES_REGEX = r'[\'\u2019\u02bc]' 

例如,你有这个(乌克兰?)字包含一个单引号:

word = "п'ять" 

编辑:如果你的字包含另一种撇号,就可以恢复正常,就像这样:

word = re.sub(APOSTROPHES_REGEX , r"\'", word, flags=re.UNICODE) 

要创建一个正则表达式,你逃离这个字符串(因为在某些情况下,它可以包含特殊字符,如标点符号, 我认为)。当转义时,单引号“'”被一个转义单引号替换,如下所示:r“\'”。

你可以通过你的撇号正则表达式替换该R“\'”:

import re 
word_regex = re.escape(word) 
word_regex = word_regex.replace(r'\'', APOSTROPHES_REGEX) 

新的正则表达式可以被用来同一个词有任何撇号匹配:

assert re.match(word_regex, "п'ять") # ' 
assert re.match(word_regex, "п’ять") # \u2019 
assert re.match(word_regex, "пʼять") # \u02bc 

注意:不要忘记使用re.UNICODE标志,它将帮助您处理像r“\ w”这样的RegEx字符类。

+0

仅当用户输入п'ять时才有效,当用户输入п'ять时它不起作用。 –

+0

@AndrewFount:好的,你可以在转义之前“正常化”这个词。 –