3
如何匹配出现在字符串末尾的一个或多个括号表达式?在字符串末尾匹配一系列(非嵌套)平衡圆括号
输入:
'hello (i) (m:foo)'
所需的输出:
['i', 'm:foo']
旨在用于Python脚本。 Paren标记不能出现在彼此的内部(no nesting),并且括号内的表达式可能被空格分隔。
看起来比乍看起来要困难,至少在我看来似乎如此。
如何匹配出现在字符串末尾的一个或多个括号表达式?在字符串末尾匹配一系列(非嵌套)平衡圆括号
输入:
'hello (i) (m:foo)'
所需的输出:
['i', 'm:foo']
旨在用于Python脚本。 Paren标记不能出现在彼此的内部(no nesting),并且括号内的表达式可能被空格分隔。
看起来比乍看起来要困难,至少在我看来似乎如此。
paren_pattern = re.compile(r"\(([^()]*)\)(?=(?:\s*\([^()]*\))*\s*$)")
def getParens(s):
return paren_pattern.findall(s)
甚至更短:
getParens = re.compile(r"\(([^()]*)\)(?=(?:\s*\([^()]*\))*\s*$)").findall
交代:
\( # opening paren
([^()]*) # content, captured into group 1
\) # closing paren
(?= # look ahead for...
(?:\s*\([^()]*\))* # a series of parens, separated by whitespace
\s* # possibly more whitespace after
$ # end of string
) # end of look ahead
你不需要使用正则表达式:
def splitter(input):
return [ s.rstrip(" \t)") for s in input.split("(") ][1:]
print splitter('hello (i) (m:foo)')
注:如果输入已经知道是有效的这种解决方案仅适用。请参阅MizardX的解决方案,该解决方案可用于任何输入。
该规范是,我们只在字符串的结尾匹配括号表达式。给定的实现不起作用,如果我们有括号的表达式*,而不是在我们想避免匹配的字符串的末尾。 – 2009-02-17 02:47:06