Регулярное выражение Python заменяет часть строки в столбце, которая появляется после определенного регулярного выражения - PullRequest
0 голосов
/ 07 ноября 2018

Я хочу удалить вхождение V, I или VI только тогда, когда оно находится внутри скобки, как показано ниже:

Введите:

VINE(PCI); BLUE(PI)
BLACK(CVI)
CINE(PCVI)

Требуется вывод:

VINE(PC); BLUE(P)
BLACK(C)
CINE(PC)

Когда я использую df['col'].str.replace('[PC]+([VI]+)', ""), он заменяет все, что в скобках. и когда я использую только df['col'].str.replace('[VI]+', ""), это, конечно, не работает, поскольку затем удаляет все другие вхождения V и I. Внутри скобки будут только эти 4 буквы в любой комбинации одного (или обоих) ПК и любого (или обоих) VI. Что я делаю не так, пожалуйста, здесь?

Спасибо

Ответы [ 2 ]

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

Другое решение с использованием только панд:

import pandas as pd
S = pd.Series(["VINE(PCI)", "BLUE(PI)", "BLACK(CVI)", 'CINE(PCVI)'])
S.str.split('[\(\)]').apply(lambda x :  x[0] + "(" + x[1].replace("I", "").replace("V", "") + ")" + x[2])
0    VINE(PC)
1     BLUE(P)
2    BLACK(C)
3    CINE(PC)
dtype: object
0 голосов
/ 07 ноября 2018

Использование str.replace с группой захвата и обратным вызовом:

import re
df['col'] = df['col'].str.replace(
    r'\((.*?)\)', lambda x: re.sub('[VI]', '', f'({x.group(1)})'))

Или,

df['col'] = df['col'].str.replace(r'\((P|PC|C)[VI]+\)',r'(\1)') # Credit, OP
print(df)
                 col
0  VINE(PC); BLUE(P)
1           BLACK(C)
2           CINE(PC)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...