【问题标题】:Pandas: str.contains using regex熊猫:str.contains 使用正则表达式
【发布时间】:2018-04-30 05:45:24
【问题描述】:

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

数据框:

                  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]$')]

它返回空数据框。

我该如何解决这个问题?

【问题讨论】:

  • 你为什么要使用这样的范围? \w。另外,请避开您的句号,否则它会被视为通配符:\.
  • 正如@TheIncorrigible1 提到的,使用[\w-] 代替第一组,使用\. 作为文字点而不是除换行符以外的任何字符(除非使用s 修饰符)。您也可以将[^\W_] 用于第二组。 ^[\w-]+\.[^\W_]$

标签: python regex pandas


【解决方案1】:

你可以试试这个:

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']

【讨论】:

  • 我只需要域,不需要子域
  • @PetrPetrov,如果您认为它已经回答了您的问题,请考虑accepting / upvoting 一个答案
猜你喜欢
  • 2017-06-18
  • 2015-11-18
  • 2019-10-19
  • 2020-10-23
  • 2016-12-31
  • 2021-08-22
  • 2021-07-20
  • 1970-01-01
相关资源
最近更新 更多