2016-11-16 2 views
0

У меня есть строка, определенная пользователем. Я хочу использовать его в регулярном выражении с небольшим улучшением: поиск по трем апострофам вместо одного. Например,Эскиз строки регулярного выражения unicode в Python

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

Это хорошо работает для латино, но для списка юникода понимание дает следующую строку: "[\\'\\\\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

Почему бы просто не заменить '' ''' ''' '\\ u2019 \\ u02bc'' после * применения 're.escape'? –

ответ

2

Я понимаю: вы хотите создать регулярное выражение, которое может соответствовать заданное слово с любым апостроф:

регулярное выражение, которое соответствует любому апостроф может быть определена в группе:

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

например, у вас есть это слово, которое содержит апостроф (украинский):

word = "п'ять" 

EDIT: Если слово содержит еще один вид апостроф, вы можете нормализовать его, как это:

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

+0

Это работает, только когда пользователь вводит п'ять, он не работает, когда пользователь вводит п'ять. –

+0

@AndrewFount: Хорошо, так что вы можете «нормализовать» слово перед побегом. –

Смежные вопросы