Python (регулярное выражение: замена каждого символа после одной буквы) - PullRequest
2 голосов
/ 14 января 2020

Я ищу соответствие всех строк в столбце Pandas. Строки в аналогичном формате.

9201 AVENUE B - GROUND FL REAR
56-58 AVENUE B STORE #2
9201 AVENUE B - GROUND FL REAR
1315 AVENUE C
431 WEST AVENUE D BASEMENT UNIT
12334 Avenue Z Store 

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

9201 AVENUE B
56-58 AVENUE B
9201 AVENUE B
1315 AVENUE C
431 WEST AVENUE D
12334 Avenue Z

У меня есть текущий код:

r"AVENUE\s([^A-Z].*)", ''

Однако код не может заменить все, что идет после буквы. Любая помощь будет оценена. Спасибо!

Ответы [ 3 ]

2 голосов
/ 14 января 2020

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

re.sub(r"\b(AVENUE\s+[A-Z]).*", r"\1", text, flags=re.I)

См. Демо regex и демо Python :

import re
strs = ['9201 AVENUE B - GROUND FL REAR', '56-58 AVENUE B STORE #2', '9201 AVENUE B - GROUND FL REAR', '1315 AVENUE C', '431 WEST AVENUE D BASEMENT UNIT', '12334 Avenue Z Store ']
for s in strs:
    print(re.sub(r"\b(AVENUE\s+[A-Z]).*", r"\1", s, flags=re.I))
# => [9201 AVENUE B, 56-58 AVENUE B, 9201 AVENUE B, 1315 AVENUE C, 431 WEST AVENUE D, 12334 Avenue Z]

Шаблон соответствует :

  • \b - граница слова
  • (AVENUE\s+[A-Z]) - Группа 1 (значение указывается с помощью заполнителя \1 из шаблона замены):
    • AVENUE - буквенная строка
    • \s+ - 1+ пробелы
    • [A-Z] - буква ASCII
  • .* - любые 0+ символов, кроме символов разрыва строки, как можно больше.

ПРИМЕЧАНИЕ : флаг re.I сделает регистр [A-Z] нечувствительным к регистру. Чтобы избежать этого, используйте re.sub(r"\b((?i:AVENUE)\s+[A-Z]).*", r"\1", s), см. this Python demo .

1 голос
/ 14 января 2020

Ваше регулярное выражение соответствует всему, начиная с AVENUE, за которым следует не буква, и заменяет все это пустой строкой. Таким образом, при совпадении он удаляется целиком.

Вы можете использовать lookbehind , чтобы сопоставить остаток строки, когда ему предшествует AVENUE <letter>, но не включить его в совпадение.

re.sub(r"(?<=AVENUE [A-Z]).*", "", text)
0 голосов
/ 14 января 2020

С pandas вы можете сделать замену str

df[col].str.replace('((?<=AVENUE [A-Z]).*)', '')

0        9201 AVENUE B
1       56-58 AVENUE B
2        9201 AVENUE B
3        1315 AVENUE C
4    431 WEST AVENUE D
5       12334 AVENUE Z
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...