Pandas:str。包含正则表达式

Pet*_*rov 2 python regex pandas

我有数据框,我需要使用正则表达式进行过滤。

数据框:

                  domain                    tag1  
0         ^mail.ru/search                  ??????   
1             go.mail.ru$              ???-??????   
2           vk.com/audios              ??????????   
3            vk.com/video              ??????????   
4             vk.com/apps              ??????????   
5                  vk.com              ??????????   
6       ^yandex.ru/search                  ??????   
7       ^yandex.ru/pogoda                  ??????   
8             ^yandex.ru$              ???-??????
Run Code Online (Sandbox Code Playgroud)

我只需要获取域名

我尝试使用

def get_domain_encoding(df):
    return df[df.domain.str.contains(r'[a-zA-Z0-9-_]+.[a-zA-Z0-9]')]
Run Code Online (Sandbox Code Playgroud)

它又回到了我

                   domain                    tag1  
0         ^mail.ru/search                  ??????      
2           vk.com/audios              ??????????   
3            vk.com/video              ??????????   
4             vk.com/apps              ??????????   
5                  vk.com              ??????????   
6       ^yandex.ru/search                  ??????   
7       ^yandex.ru/pogoda                  ??????   
8             ^yandex.ru$              ???-??????
Run Code Online (Sandbox Code Playgroud)

当我将其更改为

def get_domain_encoding(df):
    return df[df.domain.str.contains(r'^[a-zA-Z0-9-_]+.[a-zA-Z0-9]$')]
Run Code Online (Sandbox Code Playgroud)

它返回我空的数据框。

我该如何解决?

Sco*_*ton 5

您可以尝试以下方法:

df.domain.str.extract('(\w+\.)?(\w+\.\w+)', expand=False)[1]
Run Code Online (Sandbox Code Playgroud)

输出:

0      mail.ru
1      mail.ru
2       vk.com
3       vk.com
4       vk.com
5       vk.com
6    yandex.ru
7    yandex.ru
8    yandex.ru
Name: 1, dtype: object
Run Code Online (Sandbox Code Playgroud)

稍加清理即可修改,使用命名组并丢弃“子域”组:

df.domain.str.extract('(?P<subdomain>\w+\.)?(?P<domain>\w+\.\w+)',expand=False)['domain']
Run Code Online (Sandbox Code Playgroud)