为什么这个python正则表达式只匹配一个字符,而不是所需的单词?

时间:2015-05-09 15:52:29

标签: python regex

我正在尝试从文本文档中提取大写的标题。我想避免一个长的虚线序列和一些缩写,如NOM-059-SEMARNAT 2010出现在标题周围;可能还有一些其他字符要排除。

为了实现这个目标,我使用了python模块findall中的re函数(在python 2.7.7下,spyder,windows 8.1中)。这是我使用的正则表达式:

(?!(?:[- ]{2,}|NOM\-059\-SEMARNAT))([A-Z0-9ÁÉÍÓÚÑ:;¿\?\(\)\-\+\. ,]{10,})

我得到了许多好的比赛,但也有一些像这样(其中“N”被跳过):

  

OM-059-SEMARNAT-2010(SEMARNAT,2010)。 P

如何避免这些糟糕的比赛?

我使用此模式扫描的文档示例如下:

  

--------------------------------------------- Congreso Mexicano
  RELACIÓNENTTREELTAMAÑODELFOROFITO Y LA RIQUEZADEEPÍFITASENLOS   PANTANOS DE CENTLA,TABASCO DwersAasrdJxcxéasLóasd1*,Rasdéde   JawdúzRasdwVasde1 Instituto de Ciencias Biologicas,Universidad de   Ciencias y Artes de Chiapas awdsd.w@hlksajk.com Las plantas   epífitasponpoco comunes en manglares,没有epífitasylas   característicasdelos forofitos de Rhizophora mangle,especie   amenazada de acuerdo a la NOM-059-SEMARNAT-2010(SEMARNAT,2010); enáreas   de la reserva Pantanos de Centla,al noroeste de Tabasco。 Se评估   relaciónentreLa riquezadeepífitasestuvosignificativamente   Relacionada con la coberturadeííydDAP de los forofitos。拉斯佐纳斯   I y III de los forofitos fueronlasmássimilaresy compartieron 47%   del total de las especies。 La zona I,que son las Palabras clave:   Epífitasvasculares,distribuciónvertical,composición,Rhizophora   mangle,raícesaéreas。 ID:96 lunes,20 de abril de 2015,3:30:00 PM,   Sala:8Ejetemático:EcologíadeComunidades

     

1 个答案:

答案 0 :(得分:0)

我认为你有足够的限制可以使这项工作 你必须滚动自己的边界并设置伪锚。

压缩:

 # (?<![A-Z0-9ÁÉÍÓÚÑ:;¿?()\-+.,])((?!(?:NOM-059-SEMARNAT))[A-ZÁÉÍÓÚÑ¿](?:(?!(?:[- ]{2,}|NOM\-059\-SEMARNAT))[A-Z0-9ÁÉÍÓÚÑ:;¿?()\-+. ,]){9,}(?<=[A-ZÁÉÍÓÚÑ?]))(?![a-z])

格式化:

 (?<! [A-Z0-9ÁÉÍÓÚÑ:;¿?()\-+.,] )             # ASSERT - Dont start in the middle of anything
 (                                            # (1 start)
      (?!                                          #  ASSERT - The start cannot be this phrases (add more)
           (?: NOM-059-SEMARNAT )
      )
      [A-ZÁÉÍÓÚÑ¿]                                 # Starts with a letter
      (?:
           (?!                                          # ASSERT - The body cannot contain this phrase  (add more)
                (?: [- ]{2,} | NOM\-059\-SEMARNAT )
           )
           [A-Z0-9ÁÉÍÓÚÑ:;¿?()\-+. ,] 
      ){9,}

      (?<= [A-ZÁÉÍÓÚÑ?] )                          # ASSERT - Ended with a letter
 )                                            # (1 end)
 (?! [a-z] )                                  #  ASSERT - Not a forward lower case when previous upper case that probably starts a sentence

或者,同样但是使用hex来扩展ascii

 # (?<![A-Z0-9\x{C1}\x{C9}\x{CD}\x{D3}\x{DA}\x{D1}:;\x{BF}?()\-+.,])((?!(?:NOM-059-SEMARNAT))[A-Z\x{C1}\x{C9}\x{CD}\x{D3}\x{DA}\x{D1}\x{BF}](?:(?!(?:[- ]{2,}|NOM\-059\-SEMARNAT))[A-Z0-9\x{C1}\x{C9}\x{CD}\x{D3}\x{DA}\x{D1}:;\x{BF}?()\-+. ,]){9,}(?<=[A-Z\x{C1}\x{C9}\x{CD}\x{D3}\x{DA}\x{D1}?]))(?![a-z])


 (?<!
      [A-Z0-9\x{C1}\x{C9}\x{CD}\x{D3}\x{DA}\x{D1}:;\x{BF}?()\-+.,] 
 )
 (                                            # (1 start)
      (?!
           (?: NOM-059-SEMARNAT )
      )
      [A-Z\x{C1}\x{C9}\x{CD}\x{D3}\x{DA}\x{D1}\x{BF}] 
      (?:
           (?!
                (?: [- ]{2,} | NOM\-059\-SEMARNAT )
           )
           [A-Z0-9\x{C1}\x{C9}\x{CD}\x{D3}\x{DA}\x{D1}:;\x{BF}?()\-+. ,] 
      ){9,}

      (?<=
           [A-Z\x{C1}\x{C9}\x{CD}\x{D3}\x{DA}\x{D1}?] 
      )
 )                                            # (1 end)
 (?! [a-z] )