Python 3,使用正则表达式进行复杂的字符串排序

时间:2018-03-30 05:51:52

标签: python regex sorting

我的文件名是这样的:

'aaaa 4b 123b.txt'
'aaaa 4b 124b.txt'
'aaaa 4b 125b.txt'
'aaaa 4b 126b.txt'
'aaaa 4b 127b.txt'
'aaaa 4b 128b.txt'
'aaaa 4b 129 (123c)b.txt'
'aaaa 4b 129 (124c)b.txt'
'aaaa 4b 129 (125c)b.txt'
'aaaa 4b 129 (126c)b.txt'
'aaaa 4b 129 (127c)b.txt'
'aaaa 4b 129b.txt'
'aaaa 4b 130b.txt'
'aaaa 4b 131b.txt'
'aaaa 4b 132b.txt'

使用os.listdir(path)

将每个文件名存储在列表中

以上是文件的排序方式,但实际上我的文件根本没有排序。 129系列文件名中的括号使问题变得复杂。如果某些文件名中没有括号,我可以使用

进行排序
List.sort(key = lambda x: int(re.search('([0-9]+)(b.txt)', x).group(1)))

但是如何为具有括号的文件创建例外,并立即对所有内容进行排序?

编辑: 原始(未排序列表)

['aaaa 4b 128b.txt', 'aaaa 4b 127b.txt', 'aaaa 4b 129 (127c)b.txt', 'aaaa 4b 131b.txt', 'aaaa 4b 123b.txt', 'aaaa 4b 129 (125c)b.txt' ...]

我希望如何:

['aaaa 4b 123b.txt', 'aaaa 4b 124b.txt', 'aaaa 4b 125b.txt' ... 'aaaa 4b 128b.txt', 'aaaa 4b 129 (124c)b.txt', 'aaaa 4b 129 (125c)b.txt', ... 'aaaa 4b 131b.txt', 'aaaa 4b 132b.txt']

2 个答案:

答案 0 :(得分:3)

您不需要正则表达式。只需使用str.split()

filenames.sort(key = str.split)

str.split()将每个文件名转换为单词列表,这些单词按字典顺序排序,也称为“电话簿顺序”。

考虑问题列表中的前两个文件名:

sort()想要将'aaaa 4b 123b.txt''aaaa 4b 124b.txt'进行比较。首先,它将str.split()应用于每个字符串。结果比较在['aaaa', ',4b', '123b.txt']['aaaa', '4b', '124b.txt']之间。 list比较按字典顺序进行(也称为“电话簿订单”。依次对列表中的每个元素进行比较:

'aaaa' == 'aaaa'
'4b' == '4b'
'123b.txt' < '124b.txt'

因此第一个文件名被评估为小于第二个文件名。

同样适用于'aaaa 4b 129 (127c)b.txt''aaaa 4b 129b.txt'

'aaaa' == 'aaaa'
'4b' == '4b'
'129' < '129b.txt'

所以这两个文件名有适当的比较。

答案 1 :(得分:1)

常规字符串排序算法的问题是什么?

A = [
'aaaa 4b 127b.txt',
'aaaa 4b 129 (125c)b.txt',
'aaaa 4b 128b.txt',
'aaaa 4b 129 (123c)b.txt',
'aaaa 4b 129b.txt',
'aaaa 4b 129 (127c)b.txt',
'aaaa 4b 129 (124c)b.txt',
'aaaa 4b 129 (126c)b.txt',
]

A.sort()
print '\n'.join(A)

打印

aaaa 4b 127b.txt
aaaa 4b 128b.txt
aaaa 4b 129 (123c)b.txt
aaaa 4b 129 (124c)b.txt
aaaa 4b 129 (125c)b.txt
aaaa 4b 129 (126c)b.txt
aaaa 4b 129 (127c)b.txt
aaaa 4b 129b.txt

这是因为常规排序算法使用__lt__()(小于)string方法来比较列表中的字符串元素,这导致文件名按字典顺序排序(aka字典顺序)。

空白&#39; &#39;以下129是less than&#39; b&#39;在另一个字符串中跟随129。

在带括号的字符串中,因为它们都有&#39; (12&#39;跟随129,下一个字符,5,3,7,4和6用于比较。