繁体   English   中英

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

[英]Escaping regex unicode string in Python

我有一个用户定义的字符串。 我想在 regex 中使用它并稍作改进:搜索三个撇号而不是一个。 例如,

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

它适用于拉丁语,但对于 unicode 列表理解给出以下字符串: "[\\\\'\\\\\\\’\\\\\\\ʼ]\\xd0[\\\\'\\\\\\\’\\\\\\\ʼ]\\xbf[\\\\'\\\\\\\’\\\\\\\ʼ][\\\\'\\\\\\\’\\\\\\\ʼ][\\\\'\\\\\\\’\\\\\\\ʼ]\\xd1[\\\\'\\\\\\\’\\\\\\\ʼ]\\x8f[\\\\'\\\\\\\’\\\\\\\ʼ]\\xd1[\\\\'\\\\\\\’\\\\\\\ʼ]\\x82[\\\\'\\\\\\\’\\\\\\\ʼ]\\xd1[\\\\'\\\\\\\’\\\\\\\ʼ]\\x8c"

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

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

我怎样才能避免它? 我想得到"\\п[\\'\’\ʼ]\\я\\т\\ь"

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

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

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

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

word = "п'ять"

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

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

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

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

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"。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM