熊猫:str.contains使用正则表达式

时间:2017-11-16 15:49:22

标签: 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$              Веб-портал

我只需要获得域名

我尝试使用

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

它会让我回头

                   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$              Веб-портал

当我将其更改为

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

它返回空数据帧。

我该如何解决?

1 个答案:

答案 0 :(得分:4)

你可以试试这个:

df.domain.str.extract('(\w+\.)?(\w+\.\w+)', expand=False)[1]

输出:

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

使用一些清理进行修改,使用命名组并丢弃“子域”组:

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