Python正则表达式替换了特定正则表达式

时间:2018-11-07 03:21:07

标签: python regex pandas

仅当它位于方括号内时,我才希望删除出现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。 在PC或VI的任意组合中,支架内仅包含这4个字母。 请问我在做什么错了?

谢谢

2 个答案:

答案 0 :(得分:1)

对捕获组和回调使用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)

答案 1 :(得分:0)

仅使用熊猫的另一种解决方案:

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