2016-11-16 77 views
0

我有一個用戶定義的字符串。 我想用它在小改進的正則表達式:由三個撇號而不是一個。 例如,在Python中轉義正則表達式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"

看起來它發現兩個字符串中的反斜槓,然後替換撇號

而且,print(list(w for w in APOSTROPHES))給出['\\', "'", '\\', '\\', 'u', '2', '0', '1', '9', '\\', '\\', 'u', '0', '2', 'b', 'c']

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

+0

爲什麼不在'應用're.escape'後用'['\\ u2019 \\ u02bc]'*替換'''''? –

回答

2

我的理解是:您想創建一個正則表達式,可以用任何撇號匹配一個給定的詞:

匹配任何撇號可以在組中定義的正則表達式:

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

例如,你有這個(烏克蘭?)字包含一個單引號:

word = "п'ять" 

編輯:如果你的字包含另一種撇號,就可以恢復正常,就像這樣:

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

要創建一個正則表達式,你逃離這個字符串(因爲在某些情況下,它可以包含特殊字符,如標點符號, 我認爲)。當轉義時,單引號「'」被一個轉義單引號替換,如下所示:r「\'」。

你可以通過你的撇號正則表達式替換該R「\'」:

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

新的正則表達式可以被用來同一個詞有任何撇號匹配:

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

注意:不要忘記使用re.UNICODE標誌,它將幫助您處理像r「\ w」這樣的RegEx字符類。

+0

僅當用戶輸入п'ять時纔有效,當用戶輸入п'ять時它不起作用。 –

+0

@AndrewFount:好的,你可以在轉義之前「正常化」這個詞。 –