在Python中转义正则表达式unicode字符串

时间:2016-11-16 07:39:06

标签: python regex string 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"

看起来它在两个字符串中都找到了反斜杠,然后替换了APOSTROPHES

此外,print(list(w for w in APOSTROPHES))提供了['\\', "'", '\\', '\\', 'u', '2', '0', '1', '9', '\\', '\\', 'u', '0', '2', 'b', 'c']

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

1 个答案:

答案 0 :(得分:2)

我的理解是:你想要创建一个正则表达式,它可以将给定单词与任何撇号匹配:

可以在组中定义与任何撇号匹配的RegEx:

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

例如,您有这个(乌克兰语?)单词,其中包含单引号:

word = "п'ять"

编辑:如果您的单词包含其他类型的撇号,您可以将其标准化,如下所示:

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

要创建一个RegEx,你可以转义这个字符串(因为在某些上下文中,它可以包含像标点符号这样的特殊字符)。转义时,单引号"'"""""被转义的单引号取代,如下所示:r" \'"。

你可以替换这个" \'"你的撇号RegEx:

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

然后可以使用新的RegEx将相同的单词与任何撇号匹配:

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

注意:不要忘记使用re.UNICODE标志,它会帮助您处理某些RegEx字符类,例如r" \ w"。