2016-08-11 65 views
0

我需要搜索可能有許多元字符的模式。目前我使用一個很長的正則表達式。在Python中轉義所有元字符

prodObjMatcher=re.compile(r"""^(?P<nodeName>[\w\/\:\[\]\<\>\@\$]+)""", re.S|re.M|re.I|re.X) 

(我的實際模式是很長,所以我只是貼在我需要幫助的一些相關的部分)

,這是特別痛苦的時候,我需要一個重新編譯寫這樣的模式的組合。

是否有縮短圖案長度的pythonic方法?

+1

如果匹配空字符串,爲什麼在末尾使用'。*?'?另外,除了速記類,'''''''',''''和''''''外,你不必*字符類中的任何字符。有些方法可以保留字符類中未轉義的字符(除了'''')。 –

+2

除了註釋之外,這聽起來像'xml' **解析**(節點名稱???)的工作。 – Jan

+0

@WiktorStribiżew***我的實際模式很長,所以我只是粘貼了一些我需要幫助的相關部分***。如果能夠得到所要求的答案,這將是一件好事。我還不是Python中的正則表達式的專家,因此通常會轉義元字符。隨着時間的推移,可能會學習逃避什麼,哪些不會。 –

回答

2

你看,你的模式可以降低到

r"""^(?P<nodeName>[]\w/:[<>@$]+).*?""" 

注意,你不必永遠逃避的字符類的任何非文字字符,除了速記班,^-],和\。有辦法讓即使是那些(除\)在字符類轉義:

  • ]在字符類
  • -在字符類
  • ^的開始/結束的開始 - 如果將它放在字符類的起始處作爲文字符號,應該只能被轉義。

在字符類之外,你必須逃脫\[()+$^*?.

請注意/不是Python正則表達式模式中的一個特殊的正則表達式元字符,並且不必轉義。

定義您的正則表達式模式以避免問題(如混淆字邊界r'\b'和退格'\b')使用原始字符串文字。

+1

謝謝,這是有用的信息。 –