У меня есть три строки, которые содержат информацию о названии улицы и номере квартиры.

"32 Syndicate street", "Street 45 No 100" и "15, Tom and Jerry Street"

Вот,

"32 Syndicate street" -> {"street name": "Syndicate street", "apartment number": "32"}
"Street 45 No 100" -> {"street name": "Street 45", "apartment number": "No 100"}
"15, Tom and Jerry Street" -> {"street name": "Tom and Jerry Street", "apartment number": "15"}

Я пытаюсь использовать регулярное выражение Python, чтобы получить названия улиц и номера квартир отдельно. Это мой текущий код, в котором есть проблемы:

import re 
for i in ["32 Syndicate street","Street 45 No 100","15, Tom and Jerry Street"]:
    ###--- write patterns for street names
    pattern_street = re.compile(r'([A-Za-z]+\s?\w+ | [A-Za-z]+\s?[A-Za-z]+\s?[A-Za-z]+\s? | [A-Za-z]+\s?)') 
    match_street = pattern_street.search(i) 
    
    ###--- write patterns for apartment numbers
    pattern_aptnum = re.compile(r'(^\d+\s? | [A-Za-z]+[\s?]+[0-9]+$)') 
    match_aptnum = pattern_aptnum.search(i)

    fin_street = match_street[0] ##--> final street name
    fin_aptnum = match_aptnum[0] ##--> final apartment name 

    print("street--",fin_street)
    print("apartmentnumber--",fin_aptnum)

Я получаю следующий вывод:

street--  Syndicate street 
apartmentnumber-- 32 
street-- Street 45 
apartmentnumber--  No 100

У меня две проблемы:

  1. Я не могу получить номер квартиры "15" в последней строке.
  2. Почему в начале street-- Syndicate street и apartmentnumber-- No 100 стоит пробел
5
Srivatsan 29 Авг 2020 в 19:50

2 ответа

Лучший ответ

Вы можете получить номер квартиры, используя

^\d+|\bNo\s*\d+

См. демонстрацию регулярных выражений. Регулярное выражение ^\d+|\bNo\s*\d+ соответствует либо одной или нескольким цифрам в начале строки, либо No, нулю или нескольким пробелам, а затем одной или нескольким цифрам.

Чтобы захватить информацию об улице, вы можете использовать

^\d+,?\s*(.*)|^(.*?)\s+No\s*\d+

См. эту демонстрацию регулярного выражения. Детали:

  • ^\d+,?\s*(.*) - начало строки, одна или несколько цифр, необязательная запятая, 0+ пробелов, а затем любой ноль или более символов, кроме символов разрыва строки, максимальное количество захваченных в Группу 1
  • | - или
  • ^(.*?)\s+No\s*\d+ - начало строки, любой ноль или более символов, кроме символов разрыва строки, как можно больше, захваченных в Группу 2, 1+ пробелов, No, 0+ пробелов, а затем 1+ цифр.

В Python никогда не компилируйте регулярные выражения внутри цикла for, сделайте это раньше. См. демонстрацию Python:

import re 

pattern_aptnum = re.compile(r'^\d+|\bNo\s*\d+')
pattern_street = re.compile(r'^\d+,?\s*(.*)|^(.*?)\s+No\s*\d+') 
for i in ["32 Syndicate street","Street 45 No 100","15, Tom and Jerry Street"]:
    fin_street = ""
    fin_aptnum = ""
    print("String:", i)
    match_street = pattern_street.search(i)
    if match_street:
        fin_street = match_street.group(1) or match_street.group(2)
    match_aptnum = pattern_aptnum.search(i)
    if match_aptnum:
        fin_aptnum = match_aptnum.group()

    print("street--",fin_street)
    print("apartmentnumber--",fin_aptnum)

Выход:

String: 32 Syndicate street
street-- Syndicate street
apartmentnumber-- 32
String: Street 45 No 100
street-- Street 45
apartmentnumber-- No 100
String: 15, Tom and Jerry Street
street-- Tom and Jerry Street
apartmentnumber-- 15
3
Wiktor Stribiżew 29 Авг 2020 в 17:42
  1. Используйте re.compile(... , re.X), если вы хотите свободно использовать пробелы в регулярном выражении.
  2. print() по умолчанию вставляет пробел между несколькими аргументами.
1
Gribouillis 29 Авг 2020 в 17:01