2013-06-30 18 views
1

所以,我有一個Unicode字符長序列,我想用正則表達式匹配:無法使用可變正​​則表達式裏面

char_set = '\u0041-\u005A|\u00C0-\u00D6|\u00D8-\u00DE|\u0100|\u0102|\u0104|\u0106|\u0108|\u010A|\u010C|\u010E|\u0110|\u0112|\u0114|\u0116|\u0118|\u011A|\u011C|\u011E|\u0120|\u0122|\u0124|\u0126|\u0128|\u012A|\u012C|\u012E|\u0130|\u0132|\u0134|\u0136|\u0139|\u013B|\u013D|\u013F|\u0141|\u0143|\u0145|\u0147|\u014A|\u014C|\u014E|\u0150|\u0152|\u0154|\u0156|\u0158|\u015A|\u015C|\u015E|\u0160|\u0162|\u0164|\u0166|\u0168|\u016A|\u016C|\u016E|\u0170|\u0172|\u0174|\u0176|\u0178|\u0179|\u017B|\u017D' 

(這些都是以Unicode範圍0〜理解大寫字符382.它們中的大多數都有重音符,PEP8不鼓勵在Python腳本中使用非ASCII字符,所以我使用Unicode代碼而不是字符串文字。)

如果我直接編譯該長字符串,作品。舉例來說,這種匹配所有以這些字符中的一個開頭的單詞:

regex = re.compile(u'\A[\u0041-\u005A|\u00C0-\u00D6|\u00D8-\u00DE|\u0100|\u0102|\u0104|\u0106|\u0108|\u010A|\u010C|\u010E|\u0110|\u0112|\u0114|\u0116|\u0118|\u011A|\u011C|\u011E|\u0120|\u0122|\u0124|\u0126|\u0128|\u012A|\u012C|\u012E|\u0130|\u0132|\u0134|\u0136|\u0139|\u013B|\u013D|\u013F|\u0141|\u0143|\u0145|\u0147|\u014A|\u014C|\u014E|\u0150|\u0152|\u0154|\u0156|\u0158|\u015A|\u015C|\u015E|\u0160|\u0162|\u0164|\u0166|\u0168|\u016A|\u016C|\u016E|\u0170|\u0172|\u0174|\u0176|\u0178|\u0179|\u017B|\u017D]') 

但我想重新使用,在其他幾個正則表達式的字符順序相同。我可以簡單地複製和粘貼每一次,但這很醜陋。因此,基於以前的答案類似的問題,我已經試過這樣:

regex = re.compile(u'\A[%s]' % char_set)

沒有好。不知何故,上述表達式似乎與任何字符匹配,而不僅僅是變量'char_set'下的硬編碼。

我也試過這樣:

regex = re.compile(u'\A[' + char_set + ']')

這:

regex = re.compile(u'\A[' + re.escape(char_set) + ']')

這也太:

regex = re.compile(u'\A[{ }]'.format(char_set))

其中沒有工作如預期。

有什麼想法?我究竟做錯了什麼?

(我使用Python 2.7和Mac OS X 10.6)

回答

1

當你使用一組在方括號字符模式,你不想把任何豎線(|)該集合中的字符。相反,只需串起字符,它應該工作。這裏就是我剝|字符後,嘗試了你的角色,沒有任何問題的會話:

>>> import re 
>>> char_set = u'\u0041-\u005A|\u00C0-\u00D6|\u00D8-\u00DE|\u0100|\u0102|\u0104|\u0106|\u0108|\u010A|\u010C|\u010E|\u0110|\u0112|\u0114|\u0116|\u0118|\u011A|\u011C|\u011E|\u0120|\u0122|\u0124|\u0126|\u0128|\u012A|\u012C|\u012E|\u0130|\u0132|\u0134|\u0136|\u0139|\u013B|\u013D|\u013F|\u0141|\u0143|\u0145|\u0147|\u014A|\u014C|\u014E|\u0150|\u0152|\u0154|\u0156|\u0158|\u015A|\u015C|\u015E|\u0160|\u0162|\u0164|\u0166|\u0168|\u016A|\u016C|\u016E|\u0170|\u0172|\u0174|\u0176|\u0178|\u0179|\u017B|\u017D' 
>>> fixed_char_set = char_set.replace("|", "") # remove the unneeded vertical bars 
>>> pattern = ur"\A[{}]".format(fixed_char_set) # create a pattern string 
>>> regex = re.compile(pattern) # compile the pattern into a regex object 
>>> print regex.match("%foo") # "%" is not in the character set, so match returns None 
None 

編輯:其實,好像必須有一些其他的問題怎麼回事,因爲我不匹配"%foo"即使我使用你的原始char_set而不去除任何東西。請給出與它不匹配的文本示例!

+0

我剛剛發現問題:我沒有在字符串前加上'u'。我注意到你做了,所以我試着看看它是否有所作爲。它做到了:現在代碼有效。非常感謝! – Parzival