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