如果分隔符在字符串中,如何分隔可在字符串中多次匹配的正则表达式,即: 然后' 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开始实现它们显然不是启动它的最聪明的方式。
答案 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+\)