繁体   English   中英

从Python中的文件名中提取子字符串?

[英]Extract substring from filename in Python?

我有一个充满文件的目录,这些文件的日期字符串是文件名的一部分:

file_type_1_20140722_foo.txt
file_type_two_20140723_bar.txt
filetypethree20140724qux.txt

我需要从文件名中获取这些日期字符串,并将它们保存在数组中:

['20140722', '20140723', '20140724']

但是它们可以出现在文件名的不同位置,所以我不能只使用子字符串表示法并直接提取它。 过去,我在Bash中完成类似操作的方式如下:

date=$(echo $file | egrep -o '[[:digit:]]{8}' | head -n1)

但是我不能为此使用Bash,因为它在数学上很烂 (我需要能够加减浮点数)。 我已经尝试过glob.glob()re.match() ,但是都返回空集:

>>> dates = [file for file in sorted(os.listdir('.')) if re.match("[0-9]{8}", file)]
>>> print dates
>>> []

我知道问题在于它正在寻找八位数字长的完整文件名,但是我不知道如何使它查找子字符串。 有任何想法吗?

>>> import re
>>> import os
>>> [date for file in os.listdir('.') for date in re.findall("(\d{8})", file)]
['20140722', '20140723']

请注意,如果文件名具有9位数字的子字符串,则仅前8位数字将被匹配。 如果文件名包含16位数字的子字符串,将有2个不重叠的匹配项。

re.match从字符串开头开始匹配。 re.search在任何地方匹配模式。 或者,您可以尝试以下操作:

extract_dates = re.compile("[0-9]{8}").findall
dates = [dates[0] for dates in sorted(
    extract_dates(filename) for filename in os.listdir('.')) if dates]

您的正则表达式看起来不错,但是您应该使用re.search而不是re.match,以便它将在字符串中的任何位置搜索该表达式:

import re
r = re.compile("[0-9]{8}")
m = r.search(filename)
if m:
    print m.group(0)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM