如何使用\ w +(不使用A-Ba-b或\ d)将单词与数字分开?

我使用OCR(光学字符识别)从文件中提取了文本,并得到了以下字符串:

Lisboa                       187      
      Santo Tirso                  8\n\n        Porto                        137            Vila do Conde
 8\n\n        Maia
   119            Penafiel
       7\n\n        Vila Nova de Gaia   
         83             Portimão        
             7\n\n        Oliveira de Azeméis          18             Évora
         5\n\n

我想获取一个元组列表,每个元组(“城市名称”,“以下号码”)如下所示: [(“里斯本”,“ 187”),(“圣托尔索”,“ 8”),(“波尔图”,“ 137”),...]

我写了这个表达式: r“([[A-ZÁÉÍÓÚ] [\ w()-\] +)([\ d] +)”

因为城市名称可能包含波浪号和空格,但是我得到了(“城市名称紧随其他城市的名称之后”,“第二城市之后的数字”),如下所示: (“里斯本187 Santo Tirso”,“ 8”)。

所以:我想使用\ w +但要排除第一组中的所有数字(这将是元组的第一个元素)。我应该怎么做?

评论
  • qenim
    qenim 回复

    你可能会用

    import re
    
    junk = """
    Lisboa                       187      
          Santo Tirso                  8
    
            Porto                        137            Vila do Conde
     8
    
            Maia
       119            Penafiel
           7
    
            Vila Nova de Gaia   
             83             Portimão        
                 7
    
            Oliveira de Azeméis          18             Évora
             5
    
    
    """
    
    rx = re.compile(r'\b(?P<city>(?:[A-Za-zéÉã]+\s)+)\D+(?P<number>\d+)')
    
    cities = [(m.group('city').strip(), m.group('number'))
              for m in rx.finditer(junk)]
    
    print(cities)
    

    哪个产量

    [('Lisboa', '187'), ('Santo Tirso', '8'), ('Porto', '137'), ('Vila do Conde', '8'), ('Maia', '119'), ('Penafiel', '7'), ('Vila Nova de Gaia', '83'), ('Portimão', '7'), ('Oliveira de Azeméis', '18'), ('Évora', '5')]
    

    See a demo on regex101.com.