Skip to main content
 首页 » 编程设计

python之如何匹配正则表达式模式并使用 Pandas 将其替换为匹配组

2025年05月04日24xiaohuochai

我有以下 Pandas 系列:

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 

我想使用正则表达式提取本系列每一行中最后一个下划线之后的字符串。我能够想出与最后一个字符串匹配的正则表达式,但请注意如何在 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 系列方法提取下划线之前的最后一个字符串或找到匹配模式并将其替换为第一组吗?

请您参考如下方法:

我认为您可以拆分它而不是使用 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):

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

或者你可以使用.str.extract():

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