Pandas:使用正则表达式的str.contains

3
我可以帮你进行翻译。这段内容涉及编程,需要你使用正则表达式来筛选数据框。下面是需要处理的数据框:

Dataframe:

                  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
为什么你要这样使用范围呢?\w。另外,转义你的句点,否则它会被视为通配符:\. - Maximilian Burszley
1
正如@TheIncorrigible1所提到的,第一个集合使用[\w-],使用\.代替文字点而不是任何字符(除非使用s修饰符)。您也可以使用[^\W_]作为第二个集合。 ^ [\ w-] + \。[^\W_] $ - ctwheels
1个回答

5
您可以尝试这样做:
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

使用命名组并舍弃'subdomain'组,稍作调整即可:
df.domain.str.extract('(?P<subdomain>\w+\.)?(?P<domain>\w+\.\w+)',expand=False)['domain']

我只需要域名,不需要子域名。 - Petr Petrov
@PetrPetrov,请考虑接受/点赞一个回答,如果你认为它已经回答了你的问题。 - MaxU - stand with Ukraine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接