python - 在正则表达式 findall 中使用两种模式而不创建元组
问题描述
我想从 500 多个文件中提取数据,如下所示:
1. Site Identification of the GNSS Monument
Site Name : Aeroport du Raizet -LES ABYMES - Météo France
Four Character ID : ABMF
Monument Inscription : NONE
IERS DOMES Number : 97103M001
CDP Number : NONE
Monument Description : INOX TRIANGULAR PLATE ON TOP OF METALLIC PILAR
Height of the Monument : 2.0 m
Monument Foundation : ROOF
Foundation Depth : 4.0 m
Marker Description : TOP AND CENTRE OF THE TRIANGULAR PLATE
Date Installed : 2008-07-15T00:00Z
我正在寻找Date Installed
有两种不同格式的:CCYY-MM-DDThh:mmZ
或CCYY-MM-DD
. 现在我正在使用这样的模式:date_installed = re.findall("Date Installed\s*:\s*(.*?)T.*$", contents, re.MULTILINE)
但这只会获取CCYY-MM-DDThh:mmZ
.
如何修改我的正则表达式以在不使用|
运算符的情况下提取两种日期格式?
解决方案
使用的问题re.findall()
是,对于不应该出现在结果中的组,您需要非捕获组。所以正则表达式/Date Installed\s*:\s*(.*?(?:T.*Z)?)$/
或者/Date Installed\s*:\s*(.*?)(?:T.*Z)?$/
应该做的伎俩,见:
re.findall("Date Installed\s*:\s*(.*?(?:T.*Z)?)$", contents, re.MULTILINE)
CCYY-MM-DDThh:mmZ
这将以or的形式为您提供整个日期CCYY-MM-DD
。如果您只对CCYY-MM-DD
部分感兴趣,则只需将非捕获组移出,如上面的第二个正则表达式所示:
re.findall("Date Installed\s*:\s*(.*?)(?:T.*Z)?$", contents, re.MULTILINE)
请参阅Python 文档:
(?:...)
常规括号的非捕获版本。匹配括号内的任何正则表达式,但组匹配的子字符串在执行匹配后无法检索或稍后在模式中引用。
推荐阅读
- django - DRF 和 Knox 身份验证:允许编外用户登录
- matlab - MATLAB系列之和
- python - 我如何阅读文件的每一行并将其附加到 python 中的 json 文件中?
- c++ - 如何在多写入器情况下对文件支持的共享内存中的大页进行故障排除
- c# - 设置事件回调
在 Blazor 组件之外? - python - 通过pyspark转换在pandas数据帧上实现Plotly
- java - 关于为我的 Java Calculator 修复 equal 方法有什么建议吗?
- oracle11g - ORA-00972: 标识符太长 - 在 Oracle 11g 中对表列添加注释时
- reactjs - 材料 ui TextField 变体概述,react-seles 问题
- python - 通过使用 for 循环循环每个数据帧来处理数据帧