【问题标题】:split on multiple characters in string拆分字符串中的多个字符
【发布时间】:2020-05-30 16:51:52
【问题描述】:

我有一个文件名列表,我需要根据字符串中的某个部分对其进行排序。但是,它仅在我将文件扩展名作为排序字典的一部分时才有效。如果文件是 .jpg 或 .png,我希望它能够正常工作,所以我试图在 '_' 和 '.' 上进行拆分。字符。

sorting = ['FRONT', 'BACK', 'LEFT', 'RIGHT', 'INGREDIENTS', 'INSTRUCTIONS', 'INFO', 'NUTRITION', 'PRODUCT']

filelist = ['3006345_2234661_ENG_PRODUCT.jpg', '3006345_2234661_ENG_FRONT.jpg', '3006345_2234661_ENG_LEFT.jpg', '3006345_2234661_ENG_RIGHT.jpg', '3006345_2234661_ENG_BACK.jpg', '3006345_2234661_ENG_INGREDIENTS.jpg', '3006345_2234661_ENG_NUTRITION.jpg', '3006345_2234661_ENG_INSTRUCTIONS.jpg', '3006345_2234661_ENG_INFO.jpg']

sort = sorted(filelist, key = lambda x : sorting.index(x.re.split('_|.')[3]))

print(sort)

这会返回错误“AttributeError: 'str' object has no attribute 're'”

我需要做什么才能同时拆分 _ 和 .当拆分我的字符串进行排序时?我只想使用拆分进行排序,而不是重新形成字符串。

【问题讨论】:

  • 试试x.split 而不是x.re.split
  • 这能回答你的问题吗? Split string based on a regular expression
  • 这给出了一个错误“IndexError: list index out of range”,我认为这意味着它没有进行足够的拆分来到达 [3] 索引。
  • re.split 将第一个参数作为正则表达式,第二个作为数据输入,因此您的语法应该类似于re.split('_|.', x)[3],如下面的评论中所述。
  • 请分享整个错误信息。

标签: python regex string split attributeerror


【解决方案1】:

这里是固定代码:

sorted_output = sorted(filelist,key=lambda x: sorting.index(re.split(r'_|\.',x)[3])) 

re.split() 的字符串输入应作为函数的第二个参数传递;您不会在字符串上调用 re.split()。第一个参数是您正确的正则表达式本身。

另外:您需要使用 \ 转义 .,因为句号或句点是正则表达式中匹配所有内容的特殊字符。

输出:

In [13]: sorted(filelist,key=lambda x: sorting.index(re.split(r'_|\.',x)[3]))                       
Out[13]: 
['3006345_2234661_ENG_FRONT.jpg',
 '3006345_2234661_ENG_BACK.jpg',
 '3006345_2234661_ENG_LEFT.jpg',
 '3006345_2234661_ENG_RIGHT.jpg',
 '3006345_2234661_ENG_INGREDIENTS.jpg',
 '3006345_2234661_ENG_INSTRUCTIONS.jpg',
 '3006345_2234661_ENG_INFO.jpg',
 '3006345_2234661_ENG_NUTRITION.jpg',
 '3006345_2234661_ENG_PRODUCT.jpg']

编辑:正如@Todd 在 cmets 中提到的那样,如果您想另外确保字符串按数字部分进行排序第一次排序发生之后,请使用:

sorted(filelist,key=lambda x: [sorting.index(re.split(r'_|\.',x)[3]),x])

【讨论】:

  • 这看起来不错。只是想补充一点,如果您想将数字前缀作为辅助键进行排序,请使用: [sorting.index(re.split(...)[3]), x]
  • @Todd:感谢您的评论。我不确定我是否理解您的代码示例。能详细说明一下吗?
  • 很高兴:sorted(filelist,key=lambda x: [sorting.index(re.split(r'_|\.',x)[3]), x]) 排序(主键)的索引对它们进行排序,然后按文件名(辅助键)按字母数字顺序排序。
  • 啊,很好。知道了。更新了答案以考虑到这一点。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多