正则表达式,更好的方式

时间:2015-11-26 16:08:25

标签: python regex

如果分隔符在字符串中,如何分隔可在字符串中多次匹配的正则表达式,即: 然后' Bang bang swing'(BBS)aota' Bing Bong Bin'(BBB)

使用正则表达式:"'。+'(\ S +)" 它可以与来自' Bang ...(BBB)的Everything相匹配,而不是匹配' Bang bang swing'(BBS)和' Bing Bong Bin'(BBB)

我有一种方法可以使用正则表达式来完成这项工作:' [A-z0-9 - /?| q~`!@#$%^& *()_- = +] +&# 39;(\ S +) 但这太过分了,老实说我讨厌它甚至可以正常工作。 我对正则表达式相当新,从Pythons开始实现它们显然不是启动它的最聪明的方式。

2 个答案:

答案 0 :(得分:2)

要获得从一个角色到另一个角色的子串,两者都不能出现在之间,您应该始终考虑使用negated character classes

  

[negated]字符类匹配任何不在字符类中的字符。 与点不同,否定字符类也匹配(不可见)换行符。如果您不希望否定的字符类匹配换行符,则需要在类中包含换行符。 [^0-9\r\n]匹配任何不是数字或换行符的字符。

所以,你可以使用

'[^']*'\([^()]*\)

请参阅regex demo

下面,

  • '[^']*' - 匹配'后跟0 {+ 1}}以外的0个或更多字符,然后再次跟'
  • ' - 匹配文字\((必须转义)
  • ) - 匹配[^()]*(以外的0个或多个字符(不必在字符类中转义)
  • ) - 匹配文字\)(必须在字符类外转义)。

如果您在)部分之前可能有一个或多个单引号,则需要展开的延迟匹配正则表达式:

(...)

请参阅regex demo

这里,'[^']*(?:'(?!\([^()]*\))[^']*)*'\([^()]*\) 与带有DOTALL标志的'[^']*(?:'(?!\([^()]*\))[^']*)*'相匹配,但由于线性正则表达式执行,效率更高。请参阅more about unrolling regex technique here

编辑:

当输入字符串不复杂且短时,延迟点匹配变得更有效。但是,当复杂性增加时,惰性点匹配可能会导致问题。

答案 1 :(得分:1)

这个正则表达式怎么样

'.+?'\(\S+\)