我在為我的問題找到一些清晰易讀的解決方案時遇到了一些麻煩。所以我有一些格式相同的訊息:
message = "sender -> receiver : message_name [param1 : value1, ..., param_n : value_n] \
Loop : value Par : value Par_id : value"
生成訊息,因此它始終具有相同的格式,從一條訊息到另一條訊息的唯一變化是Par Par_id和Loop的值(始終為整數),以及引數的數量(可以是 0 :[]或多個 : [Param1 : value1, Param2 : value2, Param3 : value3])
顯然訊息名稱、發送者和接收者并不總是相同的,但我想這并不重要,因為它不會影響字串的構造方式。
例如,一條訊息可能是:
'c -> i : C_I_status [eStatus : 1, eSceEnd : 4] Loop : 0 Par : 0 Par_id : -1'
我想將這些訊息格式化為以下格式:
[sender, receiver, message_name, [ [param1, value1], ..., [param_n, value_n] ], loop_value, par_value, par_id_value]
使用上面的示例,我將得到輸出:
['c', 'i', 'C_I_status', [ ['eStatus', '1'], ['eSceEnd', '4'] ], '0', '0', '-1']
到目前為止,我已經嘗試拆分和剝離,但我對如此多的串列項和切割字串的方法感到困惑,以便獲得正確的格式。這是我帶來的:(當涉及到引數時它會變得混亂)
sender = line.split(' ', 6)[0]
receiver = line.split(' ', 6)[2]
message_name = line.split(' ', 6)[4]
params = [i.split(':') for i in line.split(' ', 6)[5].strip('[]').split(',')]
looped = line.split(' ', 6)[6].split(' ')[2]
pared = line.split(' ', 6)[6].split(' ')[5]
pared_id = line.split(' ', 6)[6].split(' ')[8]
message_stack.append([sender, receiver, message_name, params, looped, pared])
謝謝你們 :)
uj5u.com熱心網友回復:
您絕對可以使用正則運算式,但最好知道這是否始終是格式(是否生成了訊息代碼?空格總是相同的嗎?是,,Loop總是在那里?數字總是整數嗎?)。如果是這樣,正則運算式可以非常簡單(不確定可讀性):ParPar_id
import re
s = 'c -> i : C_I_status [eStatus : 1, eSceEnd : 4] Loop : 0 Par : 0 Par_id : -1'
# Extract all the required information to a list
match = re.findall('(\w ) -> (\w ) : (\w ) (\[.*\]) \w : (-*\d ) \w : (-*\d ) \w : (-*\d )', s)
if match: # If the message is well formated, it should have 1 element inside
parts = list(match[0])
# Deal with the information between `[]`
parts[3] = [x.split(' : ') for x in re.findall('\w : -*\d ', parts[3])]
# ['c', 'i', 'C_I_status', [['eStatus', '1'], ['eSceEnd', '4']], '0', '0', '-1']
您需要了解的一些關鍵事項:
\w匹配任何字母字符(加號表示 1 次或多次)-*\d匹配任何數字(這-*是一個可選的負號)\[.*\]匹配任何 (.*) 之間的[]()是捕獲組(即只回傳之間的東西())
您還可以將該正則運算式用于變數空格、十進制數等,但它會變得更復雜一些。
uj5u.com熱心網友回復:
在這里,您有一個解決方案,它結合了正則運算式和split()字串函式來實作所需的輸出:
import re
s = 'c -> i : C_I_status [eStatus : 1] Loop : 0 Par : 0 Par_id : -1'
s = s.split(":")
s = s[0].split("->") s[1:]
s[4:6] = [re.sub("[^0-9]", "", i) for i in s[4:6]]
s[2:4] = [s[2].split("[")[0], [[s[2].split("[")[1], s[3].split("]")[0]]]]
print(s)
輸出:
['c ', ' i ', ' C_I_status ', [['eStatus ', ' 1']], '0', '0', ' -1']
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/494165.html
上一篇:單詞串列之間的字串相似度
