根据正则表达式匹配或类似的东西对字符串列表进行排序

时间:2009-07-04 15:30:10

标签: python sorting

我有一个看起来有点像的文本文件:

random text random text, can be anything blabla %A blabla
random text random text, can be anything blabla %D blabla
random text random text, can be anything blabla blabla %F
random text random text, can be anything blabla blabla
random text random text, %C can be anything blabla blabla

当我readlines()时,它就成了一个句子列表。现在我希望这个列表按%之后的字母排序。所以基本上,当排序应用于上面时,它应该看起来像:

random text random text, can be anything blabla %A blabla
random text random text, %C can be anything blabla blabla
random text random text, can be anything blabla %D blabla
random text random text, can be anything blabla blabla %F
random text random text, can be anything blabla blabla

有没有一种好方法可以做到这一点,或者我是否必须将每个字符串分解为tubles,然后将字母移动到特定列,然后使用key=operator.itemgetter(col)进行排序?

谢谢

4 个答案:

答案 0 :(得分:6)

In [1]: def grp(pat, txt): 
   ...:     r = re.search(pat, txt)
   ...:     return r.group(0) if r else '&'

In [2]: y
Out[2]: 
['random text random text, can be anything blabla %A blabla',
 'random text random text, can be anything blabla %D blabla',
 'random text random text, can be anything blabla blabla %F',
 'random text random text, can be anything blabla blabla',
 'random text random text, %C can be anything blabla blabla']

In [3]: y.sort(key=lambda l: grp("%\w", l))

In [4]: y
Out[4]: 
['random text random text, can be anything blabla %A blabla',
 'random text random text, %C can be anything blabla blabla',
 'random text random text, can be anything blabla %D blabla',
 'random text random text, can be anything blabla blabla %F',
 'random text random text, can be anything blabla blabla']

答案 1 :(得分:3)

这是怎么回事?希望这有帮助。

def k(line):
    v = line.partition("%")[2]
    v = v[0] if v else 'z' # here z stands for the max value
    return v
print ''.join(sorted(open('data.txt', 'rb'), key = k))

答案 2 :(得分:1)

您可以使用自定义key函数来比较字符串。使用lambda语法,您可以编写内联,如下所示:

strings.sort(key=lambda str: re.sub(".*%", "", str));

re.sub(".*%", "", str)调用会在第一个百分号前有效删除任何内容,因此如果字符串有百分号,则会比​​较后面的内容,否则它将比较整个字符串。

迂腐地说,这不仅仅使用百分号后面的字母,它还使用了之后的所有内容。如果你想使用这封信和这封信,请尝试这个稍微长一点的行:

strings.sort(key=lambda str: re.sub(".*%(.).*", "\\1", str));

答案 3 :(得分:1)

这是一种快速而肮脏的方法。如果不了解您的排序要求,我不知道这是否满足您的需求。

假设您的列表中包含“listoflines”:

listoflines.sort( key=lambda x: x[x.find('%'):] )

请注意,这将按所有行排序,而不是'%'字符的最终字符。