使用正则表达式Python根据模式提取字符串的一部分

时间:2018-01-10 09:47:27

标签: python regex string python-3.x

我有一个遵循特定格式的文件,如下所示:

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

3 个答案:

答案 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]