【问题标题】:How to filter out strings from a list of strings with dates?如何从带有日期的字符串列表中过滤掉字符串?
【发布时间】:2022-01-02 06:50:16
【问题描述】:

如何过滤掉这个列表,让我们只剩下yyyy-mm-dd格式的字符串列表?

2021-11-11
2021-10-01
some_folder
some_other_folder

所以我们最终得到一个这样的列表:

2021-11-11
2021-10-01

如果列表有前缀怎么办?

root/2021-11-11
root/2021-10-01
user/some_folder
root/some_other_folder

我们希望最终得到:

root/2021-11-11
root/2021-10-01

【问题讨论】:

标签: python


【解决方案1】:

我会让datetime 模块使用strptime 为我处理。如果不是'%Y-%m-%d' 格式,则会引发 ValueError :

import datetime

lst = ['2021-11-11', '2021-10-01', 'some_folder', 'some_other_folder',
       'root/2021-11-11', 'root/2021-10-01',
       'user/some_folder', 'root/some_other_folder']


def filter_(s):
    last_part = s.rsplit('/', maxsplit=1)[-1]
    try:
        datetime.datetime.strptime(last_part, '%Y-%m-%d')
        return True
    except ValueError:
        return False


print([i for i in lst if filter_(i)])

输出:

['2021-11-11', '2021-10-01', 'root/2021-11-11', 'root/2021-10-01']

【讨论】:

  • 您知道如何更改您的代码以适用于我发布的编辑版本吗?谢谢:)
  • @caasswa 如果日期出现在末尾,您可以使用斜杠rsplitmaxsplit=1 然后取第二个。
  • 你能写一个简单的例子吗?对不起,这个超级菜鸟......
  • 非常感谢 :)
  • 顺便说一句,如果字符串最后都有一个/,我需要做[-2]吗?
【解决方案2】:

您可以为此使用re 库。像这样的。

编辑: 更改了我的答案,因为@SorousHBakhtiary 对我忘记了在迭代时修改可迭代对象时发生的异常的评论。

import re

li = [
'root/2021-11-11',
'root/2021-10-01',
'user/some_folder',
'root/some_other_folder',
]

new_list = li.copy()

for string in new_list:
   if not re.fullmatch('.*\d{4}-\d{2}-\d{2}$',string):
      li.remove(string)

这也可以使用列表理解在一行中完成:

li = [
'root/2021-11-11',
'root/2021-10-01',
'user/some_folder',
'root/some_other_folder',
]

li = [string for string in li if re.fullmatch('.*\d{4}-\d{2}-\d{2}$',string)]

【讨论】:

  • 当日期为২০২২-০৫-১৯时有用。
  • 这不起作用。迭代列表时,不应从列表中删除某些内容。简单的解决方法是使用for string in list.copy()
  • @SorousHBakhtiary 对,我忘了那个问题
  • 如果它像我编辑的问题怎么办?只有以 yyyy-mm-dd 结尾而不是开头的内容才重要?
  • @caasswa 那么您可以将re.fullmatch() 调用更改为开头的re.fullmatch('.*\d{4}-\d{2}-\d{2}$',string)``. The .*` 和正则表达式末尾的$ 将使程序查找任何以 yyyy-mm-dd 格式结尾的字符串。
【解决方案3】:
>>> import re
>>> 
>>> filter_pattern = re.compile(r'.*\d{4}-\d{2}-\d{2}$')
>>> 
>>> lst = [
... '2021-11-11', '2021-10-01', 'some_folder', 
... 'some_other_folder', 'root/2021-11-11', 'root/2021-10-01',
... 'user/some_folder', 'root/some_other_folder'
... ]
>>> 
>>> lst = [i for i in lst if (len(filter_pattern.findall(i) > 0)]
>>> 
>>> lst

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 2020-05-01
    • 2018-09-11
    • 2020-06-14
    相关资源
    最近更新 更多