python3解析一个分号分隔的超长字符串,以删除每一个第二元素



我对python很陌生,正在寻找一种从长字符串中获得以下结果的方法读取文本文件的行,其中每一行看起来都像这个

; 2:55:12;PuffDG;66,81; Puff4OG;66,75; Puff3OG;35,38; 

数据处理后,数据应与该数据一起存储在另一个文本文件中

的简短示例

2:55:12;66,81;66,75;35,38;        

实际字符串要长得多,但总是具有相同的模式

; 2:55:12;PuffDG;66,81; Puff4OG;66,75; Puff3OG;35,38; Puff2OG;30,25; Puff1OG;29,25; PuffFB;23,50; .... 

因此,这意味着删除前导分号保留第二元素

移除第三元素

保留第四元素

移除fith元素

保留第六元素

等等

元素的数量可能会有所不同,所以我想作为第一步,我必须解析字符串以获得元素的数量,然后在字符串中进行一些循环,并将应保留的每个部分分配给一个变量

我尝试过命令.split((的一些变体,但没有成功。将所有元素存储在列表中,然后在列表中循环保留和删除元素会更容易吗?

如果是,这会是什么样子?最后我用像这样的线路

2:55:12 ; 66,81 ; 66,75 ; 35,38 ;
2:56:12 ; 67,15 ; 74;16 ; 39,15 ;

等等。。。。

向Stefan 致以最良好的问候

此解决方案与分号之间的内容无关

有一行,虽然有点混乱:

result = ' ; '.join(string.split(';')[1::2])

删除前导分号:

把它切下来!

string = string[2:]

用分号分隔&每隔一个元素:

给定一个字符串,我们可以用分号分隔:

arr = string.split(';')[1::2]

[::2]意味着从索引1开始,每隔一秒对元素进行切片。这使所有";甚至";元素(第二、第四等(。

结果字符串

要生成所需的字符串结果,只需.join:

result = ' ; '.join(arr)

一个基于正则表达式的解决方案,它对原始输入进行操作:

inp = "; 2:55:12;PuffDG;66,81; Puff4OG;66,75; Puff3OG;35,38;"
output = re.sub(r's*[A-Z][^;]*?;', '', inp)[2:]
print(output)

此打印:

2:55:12;66,81;66,75;35,38;

这展示了如果每次都重复相同的模式,如何对一行输入执行此操作

input_str = "; 2:55:12;PuffDG;66,81; Puff4OG;66,75; Puff3OG;35,38;"
f = open('output.txt', 'w') # open text to write to
output_list = input_str.split(';')[1::2] # create list with numbers of interest 
# write to file
for out in output_list:
f.write(f"{out.strip()} ; ")    
# end line
f.write("n")

非常感谢您的快速响应。你太棒了。你的解决方案非常合理。

与此同时,我找到了另一个解决方案,但这个解决方案需要更多的代码行

向Stefan 致以最良好的问候

我不熟悉如何正确地将代码作为代码段插入所以我把它添加为纯文本

fobj = open(r"C:UsersStefanAppDataLocalProgramsPythonPython38-32Heizung_2min.log")wobj = open(r"C:UsersStefanAppDataLocalProgramsPythonPython38-32Heizung_number_2min.log","w")

对于fobj中的线路:TextLine=fobj.redline((打印(文本行(

myList = TextLine.split(';')
TextLine = ""
for index, item in enumerate(myList):
if index % 2 == 1:  
TextLine += item
TextLine += ";"
TextLine += 'n'
print(TextLine)      
wobj.write(TextLine)

遥控钥匙关闭((wobj.close((`

最新更新