首页 > 解决方案 > 在正则表达式 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:mmZCCYY-MM-DD. 现在我正在使用这样的模式:date_installed = re.findall("Date Installed\s*:\s*(.*?)T.*$", contents, re.MULTILINE)但这只会获取CCYY-MM-DDThh:mmZ.

如何修改我的正则表达式以在不使用|运算符的情况下提取两种日期格式?

标签: pythonregex

解决方案


使用的问题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 文档

(?:...)

常规括号的非捕获版本。匹配括号内的任何正则表达式,但组匹配的子字符串在执行匹配后无法检索或稍后在模式中引用。


推荐阅读