regex 如何在Pandas中的一列上执行多个正则表达式?[副本]

k4emjkb1  于 2023-10-22  发布在  其他
关注(0)|答案(3)|浏览(106)

此问题已在此处有答案

How to grab number after word in python(4个答案)
昨天关门了。
我有这个数据框
DF

Server Port
ABC1   Port Ethernet 7
ABC1   Port Ethernet 7/1
ABC1   Te0
Abc2   Port Gi1/1
Abc2   Port Ethernet 1/1
Abc2   Te1

我需要在第一个/之前提取出以太网端口和Gi端口的编号。还有一些其他的值,如Te,但我只需要t9进程端口以太网或端口Gi。
因此, Dataframe 需要看起来像这样:

Server Slot
ABC1   7
ABC1   7
Abc2   1
Abc2   1

我试过这个:

df["Slot"]=df["Port"].str.extract(Port Ethernet\s*(.*?)(?=/|$)| Port Gi\s*(.*?)(?=/|$), expand=False)

或操作数似乎不拾取端口Gi部分。知道我哪里做错了吗

ubby3x7f

ubby3x7f1#

在这种情况下,您可以使用非捕获组,以便正确地 Package |。请参阅regex101了解更多详情:

df['Port'].str.extract('Port (?:Ethernet|Gi)\s*(\d+)', expand=False)

输出量:

0      7
1      7
2    NaN
3      1
4      1
5    NaN
Name: Port, dtype: object
nxagd54h

nxagd54h2#

试试这个regexp

df['Slot'] = df['Port'].str.extract(r'(?:Port Ethernet|Port Gi)\s*(\d+)')
df.dropna(subset=['Slot'], inplace=True)
xtfmy6hx

xtfmy6hx3#

df2 = (df.loc[df['Port'].str.contains('Port')]
.assign(Slot = lambda x: x['Port'].str.extract(r'(\d+)(?:/\d+)?',expand=False)))

输出量:

Server               Port Slot
0  ABC1    Port Ethernet 7    7
1  ABC1  Port Ethernet 7/1    7
3  Abc2         Port Gi1/1    1
4  Abc2  Port Ethernet 1/1    1

相关问题