正则表达式提取日期和特定字符串

时间:2019-12-13 10:10:15

标签: python regex

我下面有一个文件名,我想提取year_TEXT部分。

fle_2019-11-17A17-21-09.01(_TEXT).txt

我可以使用两个正则表达式来执行此操作,然后加入结果。

(?<=\_)(\d{4})(?=\-) 这给了我year

(?<=\()(.*)(?=\))这给了我_TEXT

是否有一种方法可以从单个表达式中获取此信息?

2 个答案:

答案 0 :(得分:1)

一个选项是使用2个捕获组。例如,根据您允许在第一个下划线之前进行匹配的条件,您可以使用字符类来匹配不带下划线bar @ 0.5.1

的单词字符
[^\W_]+

部分

  • ^[^\W_]+_(\d{4})-[\w.-]+\(([^)]+)\)\.\w+$ 字符串的开头
  • ^匹配1个以上的字符,[^\W_]+除外
  • _匹配_
  • _捕获第1组,匹配1个以上的数字
  • (\d{4})匹配-[\w.-]+和1个以上的字符字符,-.(用可以匹配的字符扩展字符类
  • -匹配\(
    • (捕获第2组,匹配除([^)]+)以外的任何字符1次以上
  • )匹配\)
  • )匹配一个\.\w+和1个以上的字符字符
  • .字符串结尾

Regex demo | Python demo

例如

$

输出

import re

regex = r"^[^\W_]+_(\d{4})-[\w.-]+\(([^)]+)\)\.\w+$"
test_str = "fle_2019-11-17A17-21-09.01(_TEXT).txt"
print(re.findall(regex, test_str))

答案 1 :(得分:1)

为了简单起见,我们可以尝试使用re.findall并进行替换,以捕获4位数字的年份或文件名:

file = "fle_2019-11-17A17-21-09.01(_TEXT).txt"
parts = re.findall(r'\d{4}(?=-\d{2})|(?<=\().*?(?=\))', file)
print(parts)

此打印:

['2019', '_TEXT']

我喜欢这种方法,因为输出已经产生了年份和文件名的单独逻辑值。