繁体   English   中英

python匹配多行

[英]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    '

无论如何,一旦有了,就可以splitsplit

>>> 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM