Skip to main content
 首页 » 编程设计

python之在 Python 中分隔字符串,排除一些包含分隔符的元素

2025年05月04日1752php

我有一个像这样的非常难看的字符串:

# ugly string follows: 
ugly_string1 = SVEF/XX:1/60/24.02.16 07:30:00/"isk/kWh"/0/ENDTIME 
# which also may look like this (part within quotes is different): 
ugly_string2 = SVEF/XX:1/60/24.02.16 07:30:00/"kWh"/0/ENDTIME 

我想将它分开以在 Python 中获取此列表:

['SVEF/XX:1', '60', '24.02.16 07:30:00', '"isk/kWh"', '0', 'ENDTIME'] 
# or from the second string: 
['SVEF/XX:1', '60', '24.02.16 07:30:00', '"kWh"', '0', 'ENDTIME'] 

第一个元素 (SVEF/XX:1) 将始终相同,但第四个元素可能包含也可能不包含分隔符(/).

我想出了隔离第一个和第四个元素的正则表达式(example here):

(?=(SVEF/XX:1))|(?=("(.*?)")) 

但我只是不知道如何用 / 字符分隔字符串的其余部分,同时排除这两个孤立的元素?

我可以使用更“手动”的方法来完成,使用像这样的正则表达式 ( example here ):

([^/]+/[^/]+)/([^/]+)/([^/]+)/("[^"]+")/([^/]+)/([^/]+) 

但是当我在 Python 中尝试这个时,出于某种原因我得到了额外的空元素:

['', 'SVEF/XX:1', '60', '24.02.16 07:30:00', '"isk/kWh"', '0', 'ENDTIME', ''] 

之后我可以清理这个结果,但如果我在没有额外干预的情况下分离这些字符串,那就太好了。

请您参考如下方法:

在 Python 中,通过连续使用 split() 和 rsplit().

ugly_string = 'SVEF/XX:1/60/24.02.16 07:30:00/"isk/kWh"/0/ENDTIME' 
temp = ugly_string.split("/", maxsplit=4) 
result = [ temp[0]+"/"+temp[1] ] + temp[2:-1] + temp[-1].rsplit("/", maxsplit=2) 
print(result) 

打印:

['SVEF/XX:1', '60', '24.02.16 07:30:00', '"isk/kWh"', '0', 'ENDTIME'] 

我使用 split/rsplit 的第二个参数来限制拆分斜线的数量; 我首先将尽可能多的部分从左边分开(即 4),然后重新加入部分 0 和 1 (SVEF 和 XX)。然后,我使用 rsplit() 从右侧进行剩余的拆分。中间剩下的是被引用的词,不管它包含什么。

重新加入前两部分不太优雅,但也不是一种允许 / 既作为字段分隔符又出现在未加引号的字段中的格式。