Pandas str.replace () с регулярным выражением - PullRequest
0 голосов
/ 07 мая 2020

Допустим, у меня есть этот фрейм данных:

df = pd.DataFrame({'Col': ['DDJFHGBC', 'AWDGUYABC']})

И я хочу заменить все, заканчивающееся на ABC, на ABC и все, заканчивающееся на BC (кроме ABC -cases), на BC. Результат будет выглядеть так:

    Col
0   BC
1   ABC

Как я могу добиться этого с помощью регулярных выражений? Я пробовал такие вещи, как:

df.Col.str.replace(r'\w*BC\b', 'BC')
df.Col.str.replace(r'\w*ABC\b', 'ABC')

Но, очевидно, эти две строки конфликтуют, и я бы получил только BC в любом порядке, в котором я их использую.

Ответы [ 3 ]

2 голосов
/ 07 мая 2020

Вы можете сопоставить как минимум символы слова, используя \w*?, а затем захватить в группе 1, совпадающую с необязательным A, за которым следует B C (A?BC), за которым следует граница слова.

\w*?(A?BC)\b

Демо Regex

Там замена используйте группу 1

df.Col.str.replace(r'\w*?(A?BC)\b', r'\1')
1 голос
/ 07 мая 2020

Вы можете replace решение, например:

df['Col'].str.replace(r'(?s)^.*?(A?BC)$', r'\1')
# 0     BC
# 1    ABC

Здесь (?s).*?(A?BC)$ соответствует

  • (?s) - a . будет соответствовать любому символу, включая символы разрыва строки
  • ^ - начало строки
  • .*? - любые символы 0+, как можно меньше
  • (A?BC) - Группа 1 (обозначается \1 из шаблона замены): необязательный A и затем BC
  • $ - конец строки.
1 голос
/ 07 мая 2020

Как насчет этого?

df.Col.str.replace(r'\w*ABC\b', 'ABC_').str.replace(r'\w*BC\b', 'BC').str.replace(r'\w*ABC_\b', 'ABC')

Сначала \w*ABC\b заменяется ABC_. ABC_ не будет затронут replace(r'\w*BC\b', 'BC').

Затем он заменяет ABC_ на ABC, чтобы преобразовать строку обратно в исходную.

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