2016-08-11 34 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

谢谢,这是有用的信息。 –