我正在尝试提取多行字符串的一部分。具体来说,我想提出中间一对括号之间的术语列表:
'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']
所以我只能得到最后一次捕获。 ?
答案 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])