用不同的开始和结束定界符分割字符串

时间:2018-07-12 13:46:52

标签: python

我有一个日志,其中包含来自TCP端口且具有给定缓冲区长度的数据。每个事件的长度都是可变的,并且由<+++>和<--->分隔。

示例:

s = '<+++>A1 , Some Text, Other Text=12327463, Some Other Text<---> 
<+++>A2, Some Text, IP=0.0.0.0, DateTime=12/07/2018 <---> <+++> A3, Some Text, Other Text=12327463, Some Other Text,
Text<---><+++>A3, New Text, IP=0.0.0.0, DateTime=12/07/2018, Text3Text3Text3, Text3Text3Text3, Text3Text3Text3,
Text3Text3Text3<--->Text4Text4Text4Text4Text4Text4Text4Text4Text4Text4Text4Text4Text4Text4Text4 
Text4<---><+++>Text5Text5Text5Text5Text5Text5Text5Text5<---><+++>Text6Text6Text6Text6Text6Text6Text6Text6Text6<--->'

我需要对其进行拆分,以便每个事件都是列表的元素-像这样:

['A1 , Some Text, Other Text=12327463, Some Other Text' , 'A2, Some Text, IP=0.0.0.0, DateTime=12/07/2018', 'A3, Some Text, Other Text=12327463, Some Other Text']
Text']

您将如何使用Python做到这一点?

7 个答案:

答案 0 :(得分:12)

您也可以为该任务使用正则表达式,尤其是re.findall

import re
s = '<+++>A1 , Some Text, Other Text=12327463<---> <+++>A2, IP=0.0.0.0 <--->'
re.findall(r'<\+\+\+>(.+?)<--->', s)
# ['A1 , Some Text, Other Text=12327463', 'A2, IP=0.0.0.0 ']

捕获的组(.+?)代表非贪婪(+)匹配的任何字符(.)的一个或多个(?),因此无法捕获从第一个开口到最后一个结束标记的整个部分。

答案 1 :(得分:4)

类似这样的东西:

s= '<+++>A1 , Some Text, Other Text=12327463, Some Other Text<---> <+++>A2, Some Text, IP=0.0.0.0, DateTime=12/07/2018 <---> <+++> A3, Some Text, Other Text=12327463, Some Other Text, Text<---><+++>A3, New Text, IP=0.0.0.0, DateTime=12/07/2018, Text3Text3Text3, Text3Text3Text3, Text3Text3Text3, Text3Text3Text3<--->Text4Text4Text4Text4Text4Text4Text4Text4Text4Text4Text4Text4Text4Text4Text4 Text4<---><+++>Text5Text5Text5Text5Text5Text5Text5Text5<---><+++>Text6Text6Text6Text6Text6Text6Text6Text6Text6<--->'
s = s.replace('<--->','')
t = s.split('<+++>')
print (t)

答案 2 :(得分:2)

如果您想做的很简单,我只需要执行几个步骤。在这种情况下,我们可以假设字符串始终以“ <+++>”开头,以“ <--->”结尾。因此,我们可以简单地从字符串中删除它们,并使用简单的string.split

temp = s[len("<+++>") : -len("<--->")]
return temp.split("<---><+++>")

如果问题更复杂,您还可以考虑将正则表达式与re.split一起使用。

答案 3 :(得分:1)

def multi_split(s, sep):
    stack = [s]
    for char in sep:
        pieces = []
        for substr in stack:
            pieces.extend(substr.split(char))
        stack = pieces
    return stack

用法:multi_split(string,separators),其中sep可以是单个字符,字符串列表和元组。就您而言,['<--->','<+++>']

答案 4 :(得分:1)

正则表达式是您的朋友。

import re
res = re.compile('\<...\>').split(s)

然后必须清除列表中的空字符串。

res = list(filter(None, res))

答案 5 :(得分:0)

您可以先拆分再加入再拆分

new = s.split('<+++>')
new = ''.join(new)
new = new.split('<--->')

print(new)

甚至:

new = s.split('<+++>').
new = ''.join(new).split('<--->')

答案 6 :(得分:0)

这是另一种选择:

start, end = '<+++>', '<--->'
[item for item in (item.strip().strip(start) for item in s.split(end)) if item]

s是问题代码中s的值。