我下面有一个文件名,我想提取year
和_TEXT
部分。
fle_2019-11-17A17-21-09.01(_TEXT).txt
我可以使用两个正则表达式来执行此操作,然后加入结果。
(?<=\_)(\d{4})(?=\-)
这给了我year
(?<=\()(.*)(?=\))
这给了我_TEXT
是否有一种方法可以从单个表达式中获取此信息?
答案 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个以上的字符字符.
字符串结尾例如
$
输出
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']
我喜欢这种方法,因为输出已经产生了年份和文件名的单独逻辑值。