[2] IN: 2.12 INOUT: 3.52 (Input)
[2] IN: 2.12 INOUT: 3.52 (Input)
OUT: 2.42 INOUT: 2.62 (Output)
[2] OUT: 2.42 INOUT: 2.62 (Output)
[2] IN: 2.12 INOUT: 3.52 (Input)
OUT: 2.42 INOUT: 2.62 (Output)
[2] IN: 2.12 INOUT: 3.52 (Input)
[2] OUT: 2.42 INOUT: 2.62 (Output)
[2] IN: 2.12 INOUT: 3.52 (Input)
OUT: 2.42 INOUT: 2.62 (Output)
我需要解析这些数据和IN。/ OUT: /INOUT: 取决于所给的三个词组。
regex1 = r"\[2\]\s*IN:\s*(\S+?)\s*INOUT:\s*(\S+?)\s"
regex2 = r"\[2\]\s*OUT:\s*(\S+?)\s*INOUT:\s*(\S+?)\s"
regex3 = r"\[2\]\s*IN:\s*(\S+?)\s*INOUT:\s*(\S+?)\s.*?.\s*OUT:\s*(\S+?)\s*INOUT:\s*(\S+?)\s"
My output should be:
IN_r1 2.12 INOUT_r1 3.52
IN_r3 2.12 INOUT1_r3 3.52 OUT_r3 2.42 INOUT2_r3 2.62
OUT_r2 2.42 INOUT_r2 2.62
IN_r3 2.12 INOUT1_r3 3.52 OUT_r3 2.42 INOUT2_r3 2.62
IN_r1 2.12 INOUT_r1 3.52
OUT_r2 2.42 INOUT_r2 2.62
IN_r3 2.12 INOUT1_r3 3.52 OUT_r3 2.42 INOUT2_r3 2.62
The code I tried:
import re
regex1 = r"\[2\]\s*IN:\s*(\S+?)\s*INOUT:\s*(\S+?)\s"
regex2 = r"\[2\]\s*OUT:\s*(\S+?)\s*INOUT:\s*(\S+?)\s"
regex3 = r"\[2\]\s*IN:\s*(\S+?)\s*INOUT:\s*(\S+?)\s.*?.\s*OUT:\s*(\S+?)\s*INOUT:\s*(\S+?)\s"
data = "
[2] IN: 2.12 INOUT: 3.52 (Input)
[2] IN: 2.12 INOUT: 3.52 (Input)
OUT: 2.42 INOUT: 2.62 (Output)
[2] OUT: 2.42 INOUT: 2.62 (Output)
[2] IN: 2.12 INOUT: 3.52 (Input)
OUT: 2.42 INOUT: 2.62 (Output)
[2] IN: 2.12 INOUT: 3.52 (Input)
[2] OUT: 2.42 INOUT: 2.62 (Output)
[2] IN: 2.12 INOUT: 3.52 (Input)
OUT: 2.42 INOUT: 2.62 (Output)
lines = re.split("\[2]",data)
for line in lines:
if re.search(regex1,data):
tracks = re.findall(regex1,data,re.DOTALL)
for track in tracks:
input,inout = (float(z) for z in track)
with open("checked_ant.txt",'a') as a:
print("IN_r1",input,"INOUT_r1",inout,file=a)
elif re.search(regex2,data):
tracks = re.findall(regex2,data,re.DOTALL)
for track in tracks:
output,inout = (float(z) for z in track)
with open("checked_ant.txt",'a') as a:
print("OUT_r2",output,"INOUT_r2",inout,file=a)
elif re.search(regex3,data):
tracks = re.findall(regex3,data,re.DOTALL)
for track in tracks:
input,inout1,output,inout2 = (float(z) for z in track)
with open("checked_ant.txt",'a') as a:
print("IN_r3",input,"INOUT1_r3",inout1,"OUT_r3",output,"INOUT2_r3",inout2,file=a)
我面临的问题是,它不能正确地进行解析,而且对于每个以[2]开头的子数据,它不能得到匹配。
2 个回答
0 人赞同
虽然我觉得这个要求很奇怪(提供了regex,不能改变),但我得到了预期的结果。你可以试试。
import re
s = '''[2] IN: 2.12 INOUT: 3.52 (Input)
[2] IN: 2.12 INOUT: 3.52 (Input)
OUT: 2.42 INOUT: 2.62 (Output)
[2] OUT: 2.42 INOUT: 2.62 (Output)
[2] IN: 2.12 INOUT: 3.52 (Input)
OUT: 2.42 INOUT: 2.62 (Output)
[2] IN: 2.12 INOUT: 3.52 (Input)
[2] OUT: 2.42 INOUT: 2.62 (Output)
[2] IN: 2.12 INOUT: 3.52 (Input)
OUT: 2.42 INOUT: 2.62 (Output)'''
r1 = r"\[2\]\s*IN:\s*(\S+?)\s*INOUT:\s*(\S+?)\s"
r2 = r"\[2\]\s*OUT:\s*(\S+?)\s*INOUT:\s*(\S+?)\s"
r3 = r"\[2\]\s*IN:\s*(\S+?)\s*INOUT:\s*(\S+?)\s.*?.\s*OUT:\s*(\S+?)\s*INOUT:\s*(\S+?)\s"
def g(reg, s, n):
return float(re.search(reg, s).group(n))
paras = s.split('\n\n')
for p in paras:
if re.search(r1, p):
print(f'IN_r1 {g(r1, p, 1)} INOUT_r1 {g(r1, p, 2)}')
if re.search(r2, p):
print(f'OUT_r2 {g(r2, p, 1)} INOUT_r2 {g(r2, p, 2)}')
if re.search(r3, p):
print(
f'IN_r3 {g(r3, p, 1)} INOUT1_r3 {g(r3, p, 2)} OUT_r3 {g(r3, p, 3)} INOUT2_r3 {g(r3, p, 4)}')
为了获得更好的性能,你可以只匹配一次,并获得分组。以r1为例。
gs = re.search(r1, p)
if gs:
print(f'IN_r1 {gs.group(1)} INOUT_r1 {gs.group(2)}')
0 人赞同
这里有一个regex查找所有的方法。 我们可以先搜索每一个以[2]
开头的多行部分,然后找到所有的数据编号,并在一行中打印出来。
import re
inp = """[2] IN: 2.12 INOUT: 3.52 (Input)
[2] IN: 2.12 INOUT: 3.52 (Input)
OUT: 2.42 INOUT: 2.62 (Output)
[2] OUT: 2.42 INOUT: 2.62 (Output)
[2] IN: 2.12 INOUT: 3.52 (Input)
OUT: 2.42 INOUT: 2.62 (Output)
[2] IN: 2.12 INOUT: 3.52 (Input)
[2] OUT: 2.42 INOUT: 2.62 (Output)
[2] IN: 2.12 INOUT: 3.52 (Input)
OUT: 2.42 INOUT: 2.62 (Output)"""
first = 1
for m in re.finditer(r'\[\d+\](.*?)(?=\[\d+\]|$)', inp, flags=re.DOTALL):
nums = re.findall(r'\d+(?:\.\d+)?', m.group(1))
if first != 1:
print('')
print(' '.join(nums), end='')
first = 0
This prints:
2.12 3.52
2.12 3.52 2.42 2.62
2.42 2.62