我有一个日志,其中包含来自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做到这一点?
答案 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
的值。