[英]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.