【问题标题】:Extract part of string according to pattern using regular expression Python使用正则表达式Python根据模式提取部分字符串
【发布时间】:2018-01-10 09:47:27
【问题描述】:

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

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

【问题讨论】:

  • 你尝试过什么,你在哪里卡住了?
  • 我尝试了各种方法,但到目前为止都没有真正奏效。我之所以没有添加任何最小的示例,是因为我知道对于具有一定经验的人来说,这一定是非常简单的事情!

标签: python regex string python-3.x


【解决方案1】:

这很简单:

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

请注意,对于此类任务,正则表达式中的组运算符 () 非常有用,它允许您访问更大模式的某些子字符串,而无需单独匹配每个子字符串(有时可能比匹配更大的)。

然后您访问组的顺序是从1-n_specified 开始,其中组0 是整个匹配模式。根据您的模式定义,组本身是从左到右分配的。

附带说明,如果您可以控制它,请使用 unix 时间戳,这样您就只有一个数字可以通用地定义日期和时间。

【讨论】:

  • 这正是我要达到的地方:) 但这实际上只提取日期部分,而不是时间部分!我两个都需要。
【解决方案2】:

这里的关键是您希望每行第一个和第三个下划线之间的所有内容,因此无需担心设计正则表达式来匹配您的时间和日期模式。

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'

【讨论】:

    【解决方案3】:

    使用.split() 很容易做到这一点:

    time = filename.split("_")[1]
    date = filename.split("_")[2]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-31
      • 2021-12-30
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-06
      • 2013-06-04
      相关资源
      最近更新 更多