Python正则表达式排序列表

时间:2014-02-10 15:31:01

标签: python regex string list sorting

我有一个字符串列表,如下所示:

['dsafjhsafjkhefhajwejh;NR;123;dfgdsrhgjhdfgjhdsfjhg','jhfewrgjhdfjhgsufgssdfjgh;NR;3243;fgjdsgfjsdfkjgdf', ...]

此列表应按“;”之间的数字排序,数字始终位于“; NR;”之后,但不是每个字符串都包含一个数字。我已经尝试了数百种解决方案,但似乎都没有。

请帮帮我

编辑:

抱歉,我没有添加一些示例,所以这里是:

1

a = sorted(a, key=lambda x: x.split("NR;")[-1].split[";"][0])
  1. 中的项目: b.append(re.search(“(; NR; [0-9] *;)”,str(item)))

  2. 基本上我尝试了以上和上面的一些变化,我无法完全记住我尝试过的所有代码。

2 个答案:

答案 0 :(得分:3)

In [1]: a = ['jhfewrgjhdfjhgsufgssdfjgh;NR;3243;fgjdsgfjsdfkjgdf', 'dsafjhsafjkhefhajwejh;NR;123;dfgdsrhgjhdfgjhdsfjhg']

In [2]: a.sort(key=lambda x: x.split(';')[2])

In [3]: a
Out[3]:
['dsafjhsafjkhefhajwejh;NR;123;dfgdsrhgjhdfgjhdsfjhg',
 'jhfewrgjhdfjhgsufgssdfjgh;NR;3243;fgjdsgfjsdfkjgdf']

正如下面的@EMS指出的那样,如果总有NR;存在,则可以在NR;上拆分并使用第一部分。

a.sort(key=lambda x: int(x.split("NR;")[-1].split(";")[0]))

按顺序对列表进行排序。如果您想创建列表副本(为其分配新变量),可以使用sorted

b = sorted(a, key=lambda x: int(x.split("NR;")[-1].split(";")[0]))

端至端:

# Includes an entry without the `;NR;`
In [1]:     a = ['jhfewrgjhdfjhgsufgssdfjgh;NR;3243;fgjdsgfjsdfkjgdf', 'dsafjhsafjkhefhajwejh;NR;123;dfgdsrhgjhdfgjhdsfjhg', 'jhfewrgjhdfjhgsufgssdfjgh;fgjdsgfjsdfkjgdf']

# Remove any entry that doesn't have `;NR;` in it
In [2]:     a = filter(lambda x: ';NR;' in x, a)

# Sort with an integer version of the number found (rather than the string)
In [3]:     a.sort(key=lambda x: int(x.split("NR;")[-1].split(";")[0]))

In [4]: a
Out[4]:
['dsafjhsafjkhefhajwejh;NR;123;dfgdsrhgjhdfgjhdsfjhg',
 'jhfewrgjhdfjhgsufgssdfjgh;NR;3243;fgjdsgfjsdfkjgdf']

答案 1 :(得分:0)

对列表进行排序始终接受'key'参数,您可以将任意函数作为键传递。在您的情况下,该函数应该执行以下操作:

  1. 在“NR;”
  2. 之后找到字符串的一部分
  3. 找到那个部分的初始部分,它出现在“;”之前并将其解析为整数。
  4. 这是执行此操作的一种方法

    def func(st): # I am using your first string as a running example in this code
        nr_part = st.split("NR;")[1]  # returns "3243;fgjdsgfjsdfkjgdf"
        int_part = nr_part.split(";")[0] # returns "3243"
        return int(int_part)
    

    现在,您可以分开包含“NR”的字符串;通过使用过滤器。

    aa = filter(a, lambda x: "NR;" in x)
    

    最后,对结果列表进行排序很简单

    aa = ['jhfewrgjhdfjhgsufgssdfjgh;NR;3243;fgjdsgfjsdfkjgdf', 'dsafjhsafjkhefhajwejh;NR;123;dfgdsrhgjhdfgjhdsfjhg']
    a.sort(a, key=func)  # in place sorting
    

    或者

    sorted(a, key=func)  # Return a new sorted list
    

    一些警告:您必须确保您的假设为“NR;< int>”列表中的所有字符串都应该满足正则表达式,并且字符串的int部分不应该足够大,以便'int()'转换不会导致溢出。