![](/img/trans.png)
[英]Extract a name substring from a filename and store it in a variable in 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.