python匹配多行

时间:2014-11-25 22:47:15

标签: python regex

我正在尝试提取多行字符串的一部分。具体来说,我想提出中间一对括号之间的术语列表:

'my datagroup 2.5 {\n    nose-capabilities {\n        none\n        slow\n        800\n        1200\n    }\n}\n'

我试过这个:

re.findall('.*{.*{(?:\s*(\S+)\s*)*}\s*}', d, re.S)

# ['1200']

所以我只能得到最后一次捕获。 ?

3 个答案:

答案 0 :(得分:2)

如果您尝试使用正则表达式执行此操作,最好使用re.search和前瞻断言。

>>> re.search(r'(?s){(?!.*{)([^}]*)', d).group(1).split()
['none', 'slow', '800', '1200']

答案 1 :(得分:1)

我认为你错过了findall的观点。它为整个模式的每个匹配返回一个值。如果你想在一个模式中有多个组,那很好,但你不需要findall

事实上,你真的不需要那样做。您只需用(.*?)替换模式的整个中间部分,即可轻松捕捉第二个开括号和第一个闭合括号之间的所有内容。

注意非贪婪的比赛;否则,它会吸收一切直到最后关闭括号,而不是直到第一个。 (你可以使用先行断言,但非贪婪的匹配更简单。)

>>> re.findall('.*{.*{(.*?)}', d, re.S)
['\n        none\n        slow\n        800\n        1200\n    ']

虽然findall当然对你没有任何好处:

>>> re.search('.*{.*{(.*?)}', d, re.S).group(1)
'\n        none\n        slow\n        800\n        1200\n    '

无论如何,一旦你拥有了它,你就可以split

>>> re.search('.*{.*{(.*?)}', d, re.S).group(1).split()
['none', 'slow', '800', '1200']

答案 2 :(得分:0)

回答任意数量的嵌套大括号:

s = 'my datagroup 2.5 {\n    nose-capabilities {\n        none\n        slow\n        800\n        1200\n    }\n}\n'
# the position of the inner brace
start = s.rfind('{') + 1
end = s.find('}')
# find alphanumeric characters in substring
re.findall('\w+', s[start:end])