Как отделить слова от чисел, используя \ w + (не используя A-Ba-b или \ d)? - PullRequest
0 голосов
/ 09 апреля 2020

Я извлек текст из файла, используя 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 Санто Тирсо», «8»).

Итак : Я хочу использовать \ w +, но исключить все цифры из первой группы (которая будет первым элементом кортежа). Как мне это сделать?

1 Ответ

0 голосов
/ 09 апреля 2020

Вы можете использовать

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')]

См. демонстрацию на regex101.com .


Выражение объяснили:
\b                      # a word boundary
(?P<city>               # a capturing group named "city"
    (?:[A-Za-zéÉã]+\s)+ # allowed characters for the cites,
                        # followed by a space
)
\D+                     # not digits
(?P<number>\d+)         # first digit after the city name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...