[英]python match over multiple lines
我正在尝试提取多行字符串的一部分。 具体来说,我想拉出中间一对大括号之间的术语列表:
'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']
因此,据我所知,我只能获得最后的捕获。 ?
如果您尝试使用正则表达式执行此操作,则最好使用re.search
和先行断言。
>>> re.search(r'(?s){(?!.*{)([^}]*)', d).group(1).split()
['none', 'slow', '800', '1200']
我认为您错过了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
其split
:
>>> re.search('.*{.*{(.*?)}', d, re.S).group(1).split()
['none', 'slow', '800', '1200']
回答任意数量的嵌套括号:
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])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.