我正在研究一個大型資料集,并將我的分析從 Matlab/Octave 轉移到 Python。檔案按檔案夾/目錄組織,每個目錄名稱包含有關資料的基本資訊。在 Matlab 中,我從檔案夾名稱中提取該資訊。我想在 Python 中做同樣的事情。我對 Python 有所了解,但我絕對不是功夫大師
移動電源
from re import split
file_list = ['15L-0.3', '16L-0.4_redo', '15L-0', '16L-redo']
s_f = lambda x: float(x) if isinstance(x,(int, float))\
else [split('[^0-9.] ',x,1)[0], split('0[.0-9]*',x,1)[1]]
array = [[i, [float(i.split('L',1)[0]),
s_f(i)]]for i in file_list]
前面的代碼不適用于 的所有元素,file_list并且 lambda 的回傳值未附加到陣列中。我將標準split()與re.split()版本混合在一起。但我認為標準版本不接受正則運算式。
我需要一個陣列,一個串列串列,其中對于file_list我的每個元素獲取檔案夾名,即file_list. 那個子串列的第二個元素是一個數字在16之前的陣列,然后它可以有1個或2個其他元素。L 后面的 0 到 1 之間的數字,它并不總是存在,以及這個數字后面的任何東西,如果數字不存在,甚至是 L 本身。
對于第一個元素
[15, 0.3]
對于第二
[16, 0.4, '_redo']
對于第三
[15, 0]
對于第四
[16, '-redo']
我有幾個邏輯階段,因為我的實際字串更長并且有多個引數。我可以將其分為 0 和 1 之間的數字和/或后綴的缺失或存在,但我想看看是否有辦法使這個通用
我為此撰寫了 lambda 函式。如果輸出是單個數字或字串,則它有效。當我需要為外部串列輸出 2 個元素時會出現問題。
如果語法以我命名的方式不正確,我深表歉意。我可能會將串列與陣列混淆
歡迎任何評論、更正或建議
uj5u.com熱心網友回復:
我認為這里更好的解決方案是實際尋找您想要匹配的模式。
我認為這將解決您的問題,并且更容易除錯:
import re
file_list = ['15L-0.3', '16L-0.4_redo', '15L-0', '16L-redo']
new_file_list = []
for file in file_list:
split_file = re.findall(r'(?:\d (?:\.\d )*|[-_]redo)', file)
new_file_list.append(split_file)
print(new_file_list)
輸出:
[['15', '0.3'], ['16', '0.4', '_redo'], ['15', '0'], ['16', '-redo']]
uj5u.com熱心網友回復:
您還可以將以下解決方案與正則運算式模式一起使用,該模式捕獲所有三個部分,最后兩個可選:
import re,ast
file_list = ['15L-0.3', '16L-0.4_redo', '15L-0', '16L-redo']
rx = re.compile(r'^(\d )L(?:-(\d (?:\.\d )?))?([_-].*)?$')
array = []
for i in file_list:
m = rx.search(i)
if m:
arr = list(m.groups())
arr[0] = int(arr[0]) # This is an int
if arr[1]: # If Group 2 matched, it is either an int or float
arr[1] = ast.literal_eval(arr[1]) # Parse the second number as int or float
array.append([x for x in arr if x is not None]) # Remove any None values
print (array)
# => [[15, 0.3], [16, 0.4, '_redo'], [15, 0], [16, '-redo']]
請參閱Python 演示。這是正則運算式演示。詳情:
^- 字串的開始(\d )- 第 1 組:一位或多位數字(因此,我們可以int(arr[0])安全地使用)L-L一封信(?:-(\d (?:\.\d )?))?- 一個可選的序列-- 一個連字符(\d (?:\.\d )?)- 第 2 組:一個或多個數字,然后是 a.和一個或多個數字的可選序列
([_-].*)?- 一個可選的 Group 3:_or-然后是任何字符(除了沒有re.DOTALL標志的換行符)直到字串的末尾。
uj5u.com熱心網友回復:
您可以使用re.split前瞻正則運算式,以及帶有輔助函式的串列理解:
import re
regex = re.compile('[-_](?=\d)|(?=[-_]\D)')
def toint(n):
n2 = n.rstrip('L')
if n2.replace('.', '', 1).isnumeric():
return float(n2) if '.' in n2 else int(n2)
else:
return n
[[toint(i) for i in l] for l in map(regex.split, file_list)]
輸出:
[[15, 0.3], [16, 0.4, '_redo'], [15, 0], [16, '-redo']]
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/341571.html
