簡體   English   中英

python排序字​​符串列表使用正則表達式與不同數量的模式匹配

[英]python sort list of strings using regex with varying number of pattern matches

剛開始使用python並且難以通過多個/不同數量的匹配對字符串列表進行排序。 基本上,給定一個字符串列表,我需要按給定的正則表達式(用戶提供)拆分每個字符串,然后按給定的鍵列表(位置)排序。 密鑰可以是單個整數,也可以是按順序排列的列表。 例如:

regex = r'。 (FF | TT | SS) - ([ - \\ d] + C)_([\\ d] + V)_ _(FF | TT | SS)。

key = [2,1,3]

將按位置2,位置1,位置3對字符串列表進行排序。

我有以下適用於固定數量的位置/鍵,但無法弄清楚如何讓它工作不同數量的'鍵':

import re

strlist = ["synopsys_SS_2v_-40c_SS.lib","synopsys_SS_1v_-40c_SS.lib","synopsys_SS_2v_-40c_TT.lib","synopsys_FF_3v_-40c_FF.lib", "synopsys_TT_4v_125c_TT.lib", "synopsys_TT_1v_-40c_TT.lib"]
regex = r'.*(FF|TT|SS)_([-\.\d]+v)_([-\.\d]+c)_(FF|TT|SS).*'
key = [2,1,3]

sfids_single = sorted(strlist, key=lambda name: ( 
  re.findall(regex,name)[0][key[0]], 
  re.findall(regex,name)[0][key[1]],
  re.findall(regex,name)[0][key[2]]))

嘗試以下但它似乎不起作用:

fids_single = sorted(strlist, key=lambda name: (re.findall(regex,name)[0][i] for i in key))

也試過(沒有成功):

for i in key:
  strlist.sort(key=lambda name: re.findall(regex,name)[0][key[i]])

預期結果:

['synopsys_SS_1v_-40c_SS.lib', 'synopsys_TT_1v_-40c_TT.lib', 'synopsys_SS_2v_-40c_SS.lib', 'synopsys_SS_2v_-40c_TT.lib', 'synopsys_FF_3v_-40c_FF.lib', 'synopsys_TT_4v_125c_TT.lib']

我完全走錯了路嗎? 非常感謝任何指導。

編寫一個鍵函數,按優先順序返回每個字符串的相關部分,並將該函數用於排序鍵。

one = ["synopsys_SS_2v_-40c_SS.lib","synopsys_SS_1v_-40c_SS.lib",
       "synopsys_SS_2v_-40c_TT.lib","synopsys_FF_3v_-40c_FF.lib",
       "synopsys_TT_4v_125c_TT.lib", "synopsys_TT_1v_-40c_TT.lib"]    

expected = ['synopsys_SS_1v_-40c_SS.lib', 'synopsys_TT_1v_-40c_TT.lib',
            'synopsys_SS_2v_-40c_SS.lib', 'synopsys_SS_2v_-40c_TT.lib',
            'synopsys_FF_3v_-40c_FF.lib', 'synopsys_TT_4v_125c_TT.lib']

使用正則表達式拆分字符串;

import operator, re
pattern = r'.*(FF|TT|SS)_([-\.\d]+v)_([-\.\d]+c)_(FF|TT|SS).*'
rx = re.compile(pattern)
seq = [2,1,3]
def key(item, seq = seq):
    seq = operator.itemgetter(*seq)
    a, b, c, d = rx.findall(item)
    return seq([a, b, c, d])


one.sort(key = key)
assert one == expected

可以在不使用正則表達式的情況下編寫關鍵函數,這可以使其稍微復雜一些。

def key(item, seq = seq):
    seq = operator.itemgetter(*seq)
    _, a, b, c, d = item.split('_')
    d, _ = d.split('.')
    print a, b, c, d
    return seq([a, b, c, d])

您可能希望使用比a, b, c, d更具描述性的名稱。 它依賴於具有相同模式的字符串。

非常感謝@a_guest提供了拼圖的缺失部分。 這是工作解決方案:

fids_single = sorted(strlist, key=lambda name: tuple(re.findall(regex,name)[0][i] for i in key))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM