我有一个用户定义的字符串。
我想在正则表达式中使用它并进行一些改进:用三个撇号而不是一个搜索。
例如,
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]\я\т\ь"
最佳答案
我的理解是:您想创建一个可以将给定单词与任何撇号匹配的正则表达式:
可以在组中定义与任何撇号匹配的RegEx:
APOSTROPHES_REGEX = r'[\'\u2019\u02bc]'
例如,您有一个(乌克兰语?)单词,其中包含一个单引号:
word = "п'ять"
编辑:如果您的单词包含另一种撇号,则可以将其标准化,如下所示:
word = re.sub(APOSTROPHES_REGEX , r"\'", word, flags=re.UNICODE)
要创建RegEx,请转义该字符串(因为在某些情况下,它可能包含标点符号等特殊字符)。转义时,单引号“'”被转义的单引号替换,例如: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”)有所帮助。