如何匹配regex模式,并使用Pandas将其替换为匹配的组?

2024-09-26 22:51:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下熊猫系列:

SC_S193_M7.CONTROLDAY10.EPI.P1_Stem
SC_S194_M7.CONTROLDAY10.EPI.P1_Goblet
SC_S102_M1.CONTROLDAY3.EPI2_Enterocyte
SC_S106_M1.CONTROLDAY3.EPI2_Goblet

我想使用regex来提取本系列中每行最后一个下划线之后的字符串。我能够想出与最后一个字符串匹配的regex,但请注意,如何在pandas系列方法中实现它。在

用于匹配模式并替换为第一个匹配组\1

SC_S\d{3}_M\d\.CONTROLDAY\d{1,2}\.EPI\d?(?:\.P\d_|_)

我尝试如下所示使用.replace(),但没有成功:

.replace('SC_S\d{3}_M\d\.CONTROLDAY\d{1,2}\.EPI\d?(?:\.P\d_|_)(\w+)')

你知道如何使用Pandas series方法提取下划线前的最后一个字符串,或者找到匹配的模式并用第一个组替换它吗?在


Tags: 方法字符串模式replaceregexscepip1
2条回答

我认为您可以拆分它而不是使用RegEx:

In [170]: s
Out[170]:
0       SC_S193_M7.CONTROLDAY10.EPI.P1_Stem
1     SC_S194_M7.CONTROLDAY10.EPI.P1_Goblet
2    SC_S102_M1.CONTROLDAY3.EPI2_Enterocyte
3        SC_S106_M1.CONTROLDAY3.EPI2_Goblet
Name: 0, dtype: object

In [171]: s.str.split('_').str[-1]
Out[171]:
0          Stem
1        Goblet
2    Enterocyte
3        Goblet
Name: 0, dtype: object

或者最好使用rsplit(..., n=1)

^{pr2}$

或者,您可以使用.str.extract()

In [177]: s.str.extract(r'.*_([^_]*)$', expand=False)
Out[177]:
0          Stem
1        Goblet
2    Enterocyte
3        Goblet
Name: 0, dtype: object

另一个变体(假设s是您的系列),它应该是

s.apply(lambda r : re.sub('.*_([^_]*)$', '\\1', r))

相关问题 更多 >

    热门问题