簡體   English   中英

拆分字符串,忽略括號,包括嵌套括號

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM