簡體   English   中英

從嵌套括號中提取數據?

[英]extract data from nested parenthesis?

我有一個字符串:

test_string = 'RGBA(30(25VARGHK_65FVDFKDGV_10FVDSSLBA)_10UJN(85VOEZSR_5VAVUSR_10SQMCFE)_20BBLRG(SSLCN)_10UDSCT(80EDYFIH_10VAP_10SNE)_30EDU(50EDFva_50VAP)_10EDP(50EDFva_50SNE))'

我需要從字符串中提取數據,最終結果應如下所示:

RGBA,
30TCH:25VARGHK, 65FVDFKDGV, 10FVDSSLBA,
10UJN:85VOEZSR, 5VAVUSR, 5SQMCFE
....

等等..

我想使用正則表達式,但這里不是很好的解決方案..

這似乎讓你(幾乎)在那里 -

[_.replace("(", ": ").replace("_", ", ") for _ in re.split(r"\)_", test_string)]

輸出

['RGBA: 30TCH: 25VARGHK, 65FVDFKDGV, 10FVDSSLBA',
 '10UJN: 85VOEZSR, 5VAVUSR, 10SQMCFE
 '20BBLRG:SSLCN',
 '10UDSCT:80EDYFIH, 10VAP, 10SNE
 '30EDU:50EDF, 50VPC',
 '10EDP:50EDF, 50SNELP))']

我認為我們可能需要對邏輯進行更多澄清。 它看起來像(應該翻譯成: ,但不是每次都。這是我使用正則表達式的破解。這可能不是你想要的,但應該非常接近:

import re

def main():
    test_string = 'RGBA(30(25VARGHK_65FVDFKDGV_10FVDSSLBA)_10UJN(85VOEZSR_5VAVUSR_10SQMCFE)_20BBLRG(SSLCN)_10UDSCT(80EDYFIH_10VAP_10SNE)_30EDURKA(50EDFL_50VAP)_10EDPJ(50EDFV_50SNOL))'    
    test_string = re.sub("\)_", ",\n", test_string)
    test_string = re.sub("_", ",", test_string)
    test_string = re.sub("\(", ":", test_string)
    test_string = re.sub("\)\)", "", test_string)

    print(test_string)

if __name__ == "__main__":
    main()

結果:

RGBA:30:25VARGHK,65FVDFKDGV,10FVDSSLBA,
10UJN:85VOEZSR,5VAVUSR,10SQMCFE,
20BBLRG:SSLCN,
10UDSCT:85EDYFIH,5VAPOR,10SQMCFE,
30EDURKA:70EDFL,30VAPOR,
10EDPJ:50EDFV,50SNOL

幾乎只是一系列正則表達式。 請注意,通過按順序使用這樣的re.sub ,您可以隨時清理字符串。 您當然可以擺弄字符串的開頭以將第一個:更改為,\n但我不確定您輸入的數據是否始終相同。

正則表達式可以正常工作。 刪除外部I()后,您有許多組“ prefix ”,后跟一個(group_of_data)

如果你不想尾隨逗號,試試這個

import re

regex = r"[^(]+\([^)]+\)"

s = 'RGBA(30(25VARGHK_65FVDFKDGV_10FVDSSLBA)_10UJN(85VOEZSR_5VAVUSR_10SQMCFE)_20BBLRG(SSLCN)_10UDSCT(80EDYFIH_10VAP_10SNE)_30EDU(50EDFva_50VAP)_10EDP(50EDFva_50SNE))'


first_start = s.index('(')
print(s[:first_start])

matches = re.finditer(regex, s[first_start+1:-1], re.MULTILINE)

for _, match in enumerate(matches, start=1):
  g = match.group().lstrip('_')
  data_start = g.index('(')
  prefix = g[:data_start]
  data = ', '.join(g[data_start + 1:-1].split('_'))
  print(f'{prefix}:{data}')

輸出

RGBA
30:25VARGHK, 65FVDFKDGV, 10FVDSSLBA,
10UJN:85VOEZSR, 5VAVUSR, 10SQMCFE
20BBLRG:SSLCN
10UDSCT:80EDYFIH, 10VAP, 10SNE
30EDU:50EDFva, 50VAP
10EDP:50EDFva, 50SNE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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