我有一个像这样的非常难看的字符串:
# 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() 从右侧进行剩余的拆分。中间剩下的是被引用的词,不管它包含什么。
重新加入前两部分不太优雅,但也不是一种允许 / 既作为字段分隔符又出现在未加引号的字段中的格式。
