Вставьте пробел после второй или третьей заглавной буквы питона - PullRequest
0 голосов
/ 07 октября 2018

У меня есть датафрейм pandas, содержащий адреса.Некоторые отформатированы правильно, как 481 Rogers Rd York ON.У других между пробелом города и названием города отсутствует пробел, например: 101 9 Ave SWCalgary AB или даже возможно: 101 9 Ave SCalgary AB, где SW относится к юго-западу и S к югу.

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

До сих пор я обнаружил, что ([A-Z]{2,3}[a-z]) будет правильно соответствовать ситуации, но я не могу понять, как оглянуться назад и перейти в положение 2 или 3. В идеале,Я хотел бы использовать индекс для разделения совпадений на [-2:], но я не могу понять, как это сделать.

Я обнаружил, что re.findall('(?<=[A-Z][A-Z])[A-Z][a-z].+', '101 9 Ave SWCalgary AB') вернет последнюю часть строки, и яМожно использовать регулярное выражение с нетерпением, чтобы найти начало и затем присоединиться к ним, но это кажется очень неэффективным.

Спасибо

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

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

df['Test'] = df['Test'].str.replace(r'\b([A-Z]{1,2})([A-Z][a-z])', r'\1 \2')

См. это демонстрационное выражение regex

Подробности

  • \b- граница слова
  • ([A-Z]{1,2}) - Группа захвата 1 (позже обозначается \1 из шаблона замены): одна или две заглавные буквы
  • ([A-Z][a-z]) - Группа захвата 2 (позжеобозначается \2 из шаблона замены): заглавная буква + строчная.

Если вы хотите специально сопоставить городские квадранты , выможет использовать более конкретное регулярное выражение:

df['Test'] = df['Test'].str.replace(r'\b([NS][EW]|[NESW])([A-Z][a-z])', r'\1 \2')

См. это демонстрационное выражение .Здесь [NS][EW]|[NESW] соответствует N или S, за которыми следуют E или W или один N, E, S или W.

Демо Панды:

import pandas as pd
df = pd.DataFrame({'Test':['481 Rogers Rd York ON', 
'101 9 Ave SWCalgary AB',
'101 9 Ave SCalgary AB']})
>>> df['Test'].str.replace(r'\b([A-Z]{1,2})([A-Z][a-z])', r'\1 \2')
0      481 Rogers Rd York ON
1    101 9 Ave SW Calgary AB
2     101 9 Ave S Calgary AB
Name: Test, dtype: object
0 голосов
/ 07 октября 2018

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

([A-Z]{1,2})(?=[A-Z][a-z])

, чтобы захватить первые (или первую и вторую) заглавные буквы, а затем использовать заглавную букву для заглавной буквы, за которой следует строчная буква.Затем замените на первую группу и пробел:

re.sub(r'([A-Z]{1,2})(?=[A-Z][a-z])', r'\1 ', str)

https://regex101.com/r/TcB4Ph/1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...