Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.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 3,使用正则表达式的复杂字符串排序_Python_Regex_Sorting - Fatal编程技术网

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

Python 3,使用正则表达式的复杂字符串排序,python,regex,sorting,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.t

我有这样的文件名:

'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 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']

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

str.split()

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

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

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

因此这两个文件名具有适当的比较。

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

str.split()

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

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

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

因此,这两个文件名具有适当的比较。

常规字符串排序算法有什么问题

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
这是因为常规排序算法使用
字符串
方法(小于)比较列表中的字符串元素,这导致文件名按字典顺序(又称字典顺序)排序

129后面的空格“”小于另一个字符串中129后面的空格“b”


在带括号的字符串中,由于129后面都有“(12”),下一个字符5、3、7、4和6用于比较。

常规字符串排序算法有什么问题

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
这是因为常规排序算法使用
字符串
方法(小于)比较列表中的字符串元素,这导致文件名按字典顺序(又称字典顺序)排序

129后面的空格“”小于另一个字符串中129后面的空格“b”


在带括号的字符串中,因为它们都有'(129后面的12'下一个字符,5、3、7、4和6用于比较。

你能添加一些输入文件名的示例以及你希望它们如何排序吗?你能添加一些输入文件名的示例以及你希望它们如何排序吗?哇,这太简单了。但我不理解这背后的逻辑。你能解释一下这段代码是如何工作的吗rks?哇,这太简单了。但我不明白背后的逻辑。你能解释一下这段代码是如何工作的吗?facepalm-当然你是对的。
A.sort()
是显而易见的答案。如果我的答案还没有被接受,我会删除它。@Robᵩ 哈哈,我觉得这个问题不好。我也很困惑OP想做什么。@Ericina,我想知道A.sort()如何维护int值的层次结构?因为我给aaaa 3b 129(124c)b(1.txt)和aaaa 4b 129(124c)b(2.txt,它是先按3b排序,然后按129再按b(1)排序的,怎么说?你能在回答中解释一下吗?@Ayodhyankitpul它们不是int值。它们是字符,即使它们代表数字。你的两个字符串都以相同的
aaaa
开头,因此下一个字符“3”一个字符串与另一个字符串中的下一个字符“4”进行比较。'3'<'4',因此
aaaa 3b 129(124c)b(1).txt排在第一位,不管“3”和“4”之后是什么@Ericina所以这意味着首先比较的是“aaaa”,然后是“3”,然后是“129”,然后是“124”,最后是b(1)对吗?facepalm-当然你是对的。
A.sort()
是显而易见的答案。如果我的答案还没有被接受,我会删除它。@Robᵩ 哈哈,我觉得这个问题不好。我也很困惑OP想做什么。@Ericina,我想知道A.sort()如何维护int值的层次结构?因为我给aaaa 3b 129(124c)b(1.txt)和aaaa 4b 129(124c)b(2.txt,它是先按3b排序,然后按129再按b(1)排序的,怎么说?你能在回答中解释一下吗?@Ayodhyankitpul它们不是int值。它们是字符,即使它们代表数字。你的两个字符串都以相同的
aaaa
开头,因此下一个字符“3”一个字符串与另一个字符串中的下一个字符“4”进行比较。'3'<'4',因此
aaaa 3b 129(124c)b(1).txt排在第一位,不管“3”和“4”之后是什么@Ericina,所以它的意思是首先比较“aaaa”,然后是“3”,然后是“129”,然后是“124”,最后是b(1),对吗?