![](/img/trans.png)
[英]Extract string between two brackets, including nested brackets in python
[英]Splitting string, ignoring brackets including nested brackets
我想在空格(和冒号)处拆分字符串,大括号和圆括号内除外。 已经问过类似的问题,但答案因嵌套括号而失败。
这是要拆分的字符串的示例:
p1: I/out p2: (('mean', 5), 0.0, ('std', 2)) p3: 7 p4: {'name': 'check', 'value': 80.0}
实际目标是获取键(p1、p2、p3 和 p4)及其值的列表。 当我尝试在空格和冒号处拆分字符串时,我可以避免在大括号内的空格和冒号处拆分。 但是由于嵌套的括号,我无法避免在圆括号内的某些空间进行拆分。
我最接近的是
[\s:]+(?=[^\{\(\)\}]*(?:[\{\(]|$))
这很好,除了它在(('mean', 5),
和0.0
之间分裂。
您可以使用以下 PCRE/Python PyPi 正则表达式兼容模式:
(?:(\((?:[^()]++|(?1))*\))|(\{(?:[^{}]++|(?2))*})|[^\s:])+
请参阅正则表达式演示。
它匹配
(?:
- 容器非捕获组的开始:
(\((?:[^()]++|(?1))*\))
- 第 1 组:两个嵌套圆括号之间的 substring|
- 要么(\{(?:[^{}]++|(?2))*})
- 第 2 组:两个嵌套大括号之间的 substring|
- 要么[^\s:]
- 除了空格和冒号之外的字符)+
- 一次或多次出现。请参阅Python 演示:
import regex
text = "p1: I/out p2: (('mean', 5), 0.0, ('std', 2)) p3: 7 p4: {'name': 'check', 'value': 80.0}"
pattern = r"(?:(\((?:[^()]++|(?1))*\))|(\{(?:[^{}]++|(?2))*})|[^\s:])+"
print( [x.group() for x in regex.finditer(pattern, text)] )
Output:
['p1', 'I/out', 'p2', "(('mean', 5), 0.0, ('std', 2))", 'p3', '7', 'p4', "{'name': 'check', 'value': 80.0}"]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.