簡體   English   中英

正則表達式匹配,讓所有組都由分隔符分隔嗎?

[英]Regex match, get all groups separated by a separator token?

我有一種特殊的編碼格式,我想要一個提取編碼信息的正則表達式。 我將':'作為特殊字符分隔不同的信息“塊”。 例如:

s = 'P:1:a:3:test_data'

應該拆分為:

['P','1','a','3','test_data']

我可以用:

s.split(':')

但是,我也可以對單個':'進行編碼(永遠不會有超過1個':'分組在一起,因此不會產生歧義)。 因此,例如:

s = 'P:1:::3:test_data'

應該給:

['P','1',':','3','test_data']

在這里使用split(':')失敗:

['P', '1', '', '', '3', 'test_data']

捕獲“:”的最佳方法是什么? 我對正則表達式不是很堅強,我知道正則表達式組可以使用'* +'匹配至少一個字符,但是我對如何將它們拼湊起來感到非常困惑。 更好的是,沒有正則表達式,還有更好的方法嗎? 我想我總是可以遍歷數組,檢查連續的空字符串並將它們組合為':'。 有更優雅的方法嗎?

謝謝

對於您的特定情況,您可以使用否定環顧四周來限制要在(?<!:):|:(?!:)上分割的冒號,該冒號在冒號之前和之后都沒有另一個冒號同時:

import re
s = 'P:1:a:3:test_data'
s1 = 'P:1:::3:test_data'

re.split("(?<!:):|:(?!:)", s)
# ['P', '1', 'a', '3', 'test_data']

re.split("(?<!:):|:(?!:)", s1)
# ['P', '1', ':', '3', 'test_data']

另一個更通用並且可以處理多個選項的選項:re.findall(.+?)(?::|$)分組,即,懶惰地匹配至少一個字符,直到找到冒號或到達字符串的末尾:

re.findall('(.+?)(?::|$)', 'P:1:::3:test_data')
# ['P', '1', ':', '3', 'test_data']

re.findall('(.+?)(?::|$)', 'P:1:::::3:test_data')
# ['P', '1', ':', ':', '3', 'test_data']

暫無
暫無

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

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