我在下面的字符串中需要使用整个年份范围(例如2018-19),然后才进行关键字整体制作。

Details Unit/ Base 2017-18 2018-19 June (P) April-June (P)\r\n (P) 2018-19 2019-20 2018-19 2019-20\r\n overall production 2014-15 2015-16 monthly production

我尝试了:

re.findall(r"(\d{4}-\d{2})", string)


这让我很高兴:
['2017-18', '2018-19', '2018-19', '2019-20', '2018-19', '2019-20', '2014-15', '2015-16']。在这里,我不希望过去两年'2014-15', '2015-16',因为它是在关键字整体制作之后出现的

我也尝试过:

re.findall(r"(\d{4}-\d{2}).+overall production", string)


但是我只获得第一年的成绩
['2017-18']

有人可以帮我写一个正确的正则表达式,这样我可以在通过特定关键字之前获得所有年份范围(不考虑计数)。

最佳答案

第二次尝试中的.+overall production会消耗所有文本,直到并包括overall production,这就是为什么仅返回第一个范围的原因(此匹配之后没有第二个overall production子字符串)。

您可以使用基于前瞻性的解决方案:

re.findall(r'\b\d{4}-\d{2}\b(?=.*overall production)', text, re.DOTALL)


请参见regex demo

细节


\b-单词边界
\d{4}-\d{2}-四位数字,-,两位数字
\b-单词边界
(?=.*overall production)-一个正向的超前查询,需要(且不消耗,即,它不会使正则表达式索引随匹配项移动,并且不会将匹配的文本添加到总匹配值中)任何0+个字符,且尽可能多,紧跟在当前位置右侧的overall production子字符串。

关于python - 如何在python中使用正则表达式获取特定单词之前的所有特定模式的日期或关键字?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57411052/

10-13 04:26