我建议
^(?P<StudentIDNumber>(?P<batch>\d{2})\d*)_Task\s+(?P<Subject>[^_]+)_(?P<week>\d+)_(?P<Semester>\d+)\.(?P<Extension>\w+)$
请参阅regex demo。 详情:
-
^ - 字符串开头
-
(?P<StudentIDNumber>(?P<batch>\d{2})\d*) - 组“StudentIDNumber”:两位或多位数字,组“batch”捕获前两位数
-
_Task - 文字字符串(如果字符串未知,请使用 \w+)
-
\s+ - 一个或多个空格
-
(?P<Subject>[^_]+) - 组“主题”:_ 以外的一个或多个字符
-
_ - 一个 _ 字符
-
(?P<week>\d+) - 组“周”:一位或多位数字
-
_ - 一个 _ 字符
-
(?P<Semester>\d+) - “学期”组:一位或多位数字
-
\. - 一个点
-
(?P<Extension>\w+) - 组“扩展”:一个或多个单词字符
-
$ - 字符串结束。
见Python demo:
import re
rx = re.compile(r'^(?P<StudentIDNumber>(?P<batch>\d{2})\d*)_Task\s+(?P<Subject>[^_]+)_(?P<week>\d+)_(?P<Semester>\d+)\.(?P<Extension>\w+)$')
files = ['160608726_Task Basic Programming_02_02.pdf',
'200610612_Task PTI_12_01.xls',
'180609074_Task Industrial Automation 1_04_04.doc']
for fn in files:
print(f"Parsing {fn}")
res = rx.match(fn)
if res:
resdict = res.groupdict()
resdict["batch"] = f"20{resdict['batch']}"
print(resdict)
输出:
Parsing 160608726_Task Basic Programming_02_02.pdf
{'StudentIDNumber': '160608726', 'batch': '2016', 'Subject': 'Basic Programming', 'week': '02', 'Semester': '02', 'Extension': 'pdf'}
Parsing 200610612_Task PTI_12_01.xls
{'StudentIDNumber': '200610612', 'batch': '2020', 'Subject': 'PTI', 'week': '12', 'Semester': '01', 'Extension': 'xls'}
Parsing 180609074_Task Industrial Automation 1_04_04.doc
{'StudentIDNumber': '180609074', 'batch': '2018', 'Subject': 'Industrial Automation 1', 'week': '04', 'Semester': '04', 'Extension': 'doc'}