Python 正则表达式(版本号 - 日期格式)



我有一个这样的文件。版本的格式为<version> space(s) dash space(s) date。我想创建一个字典,其中4.11.1 - 2020-02-25作为键,之后的所有内容3.25.0 - 2019-01-01作为值,依此类推,直到文件末尾。

##################
Some texts
4.11.1 - 2020-02-25
-------------------
*some text
** Some more text
3.25.0 - 2019-01-01
-------------------
*some text
** Some more text

这是我尝试过的:

result ={}
matches = re.findall(r'([d.]+[^n]+)s*(.*?)(?=s*[d.]+[^n]+|$)', Text, re.S)
for match in matches:
result[match[0]] = match[1]
print(result)

它适用于大多数情况。但它也将这些打印为键:

.com/sth/sth/sth/6)
1.8.2 (https://github.com/sth/sth/sth/5)
1.8.1.
20160918 (see commands under 'some text')
. text text tex

您可以使用2 个捕获组,而不是使用re.S使用re.M

该模式将使用d+(?:.d+)+ +- +后跟类似日期的模式在组 1中捕获版本和空格破折号空间d{4}-d{2}-d{2}

请注意,这不会验证日期本身。本页显示如何使该日期模式更具体。

捕获组 2匹配不以 1+ 数字、点和数字开头的所有行。如果需要,您可以使该部分更具体。

^(d+(?:.d+)+ +- +d{4}-d{2}-d{2})r?n((?:(?!d+.d).*(?:r?n|$))*)

正则表达式演示

import re
result ={}
Text = ("##################n"
"Some textsnn"
"4.11.1 - 2020-02-25n"
"-------------------nn"
"*some textnn"
"** Some more textnn"
"3.25.0 - 2019-01-01n"
"-------------------nn"
"*some textnn"
"** Some more text")
matches = re.findall(r'^(d+(?:.d+)+ +- +d{4}-d{2}-d{2})r?n((?:(?!d+.d).*(?:r?n|$))*)', Text, re.M)
for match in matches:
result[match[0]] = match[1]
print(result)

输出

{'4.11.1 - 2020-02-25': '-------------------nn*some textnn** Some more textnn', '3.25.0 - 2019-01-01': '-------------------nn*some textnn** Some more text'}

最新更新