Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用不同模式匹配数的正则表达式对字符串进行python排序_Python_String_Sorting - Fatal编程技术网

使用不同模式匹配数的正则表达式对字符串进行python排序

使用不同模式匹配数的正则表达式对字符串进行python排序,python,string,sorting,Python,String,Sorting,刚刚开始使用python,并且很难按多个/不同的匹配数对字符串列表进行排序。基本上,给定一个字符串列表,我需要按给定的正则表达式(用户提供)拆分每个字符串,然后按给定的键列表(位置)排序。键可以是单个整数,也可以是按其排序顺序排列的列表。例如: regex=r.。(FF | TT | SS)([-.\d]+v)([-.\d]+c)(FF | TT | SS)。' 键=[2,1,3] 将按位置2、位置1、位置3对字符串列表进行排序 我有以下功能适用于固定数量的位置/键,但不知道如何使其适用于不同数

刚刚开始使用python,并且很难按多个/不同的匹配数对字符串列表进行排序。基本上,给定一个字符串列表,我需要按给定的正则表达式(用户提供)拆分每个字符串,然后按给定的键列表(位置)排序。键可以是单个整数,也可以是按其排序顺序排列的列表。例如:

regex=r.。(FF | TT | SS)([-.\d]+v)([-.\d]+c)(FF | TT | SS)。'

键=[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))
也尝试过(不成功):

预期结果:

['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))

拆分字符串或对结果列表排序有困难吗?能否显示所需输出的示例?这是一个家庭作业问题吗?我没有拆分问题,只是按给定的一组键排序。这不是一个家庭作业问题,这是我为工作而写的代码的一部分results@Kidneys您第一次尝试在键中使用i的
几乎是正确的,但是您使用的表达式返回了一个生成器。对于排序键,您希望使用
元组
。因此,通过使用
lambda name:tuple(…for i in key)
它应该可以工作。
fids_single = sorted(strlist, key=lambda name: tuple(re.findall(regex,name)[0][i] for i in key))