我有一个遵循特定格式的文件,如下所示:
test_0800_20180102_filepath.csv
anotherone_0800_20180101_hello.csv
中间的数字代表时间戳,所以我想提取这些信息。我知道有一个特定的模式永远是_time_date_
,所以基本上我希望字符串的一部分位于第一个和第三个下划线之间。我发现了一些示例和某些类似的问题,但我是Python新手,我无法适应它们。
这是我迄今为止实施的内容:
datetime = re.search(r"\d+_(\d+)_", "test_0800_20180102_filepath.csv")
但我得到的结果只是日期部分:
20180102
但我真正需要的是:
0800_20180101
答案 0 :(得分:3)
这非常简单:
match = re.search(r"_((\d+)_(\d+))_", your_string)
print(match.group(1)) # print time_date >> 0800_20180101
print(match.group(2)) # print time >> 0800
print(match.group(3)) # print date >> 20180101
请注意,对于此类任务,regexp中的组运算符()
非常有用,它允许您访问更大模式的某些子字符串,而无需单独匹配每个子字符串(这有时可能比模糊不清匹配较大的一个)。
您随后访问组的顺序来自1-n_specified
,其中组0
是整个匹配的模式。根据您的模式中的定义,组从左到右分配。
另一方面,如果您可以控制它,请使用unix时间戳,这样您只有一个数字可以定义日期和时间。
答案 1 :(得分:1)
这里的关键是你想要每行的第一个和第三个下划线之间的所有内容,所以不必担心设计正则表达式来匹配你的时间和日期模式。
with open('myfile.txt', 'r') as f:
for line in f:
x = '_'.join(line.split('_')[1:3])
print(x)
您的实施问题是您只捕获模式的日期部分。如果你想坚持使用正则表达式解决方案,那么只需移动括号即可捕获所需的整个模式:
re.search(r"(\d+_\d+)_", "test_0800_20180102_filepath.csv").group(1)
给出:
'0800_20180102'
答案 2 :(得分:-1)
使用.split()
非常容易:
time = filename.split("_")[1]
date = filename.split("_")[2]