Совпадение ряда (не вложенных) сбалансированных скобок в конце строки - PullRequest
3 голосов
/ 17 февраля 2009

Как мне сопоставить одно или несколько выражений в скобках в конце строки?

Введите:

'hello (i) (m:foo)'

Желаемый вывод:

['i', 'm:foo']

Предназначен для скрипта Python. Метки друг друга не могут появляться внутри друг друга ( без вложенности ), а выражения в скобках могут быть разделены пробелом.

Это сложнее, чем может показаться на первый взгляд, по крайней мере, так мне кажется.

Ответы [ 2 ]

7 голосов
/ 17 февраля 2009
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
5 голосов
/ 17 февраля 2009

Вам не нужно нужно , чтобы использовать регулярное выражение:

def splitter(input):
    return [ s.rstrip(" \t)") for s in input.split("(") ][1:]
print splitter('hello (i) (m:foo)')

Примечание: это решение работает, только если известно, что ваш ввод действителен. См. Решение MizardX, которое будет работать с любым входом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...