Python Pandas:str.contains使用正则表达式
我有数据帧,我需要用正则表达式过滤它 数据帧:Python Pandas:str.contains使用正则表达式,python,regex,pandas,Python,Regex,Pandas,我有数据帧,我需要用正则表达式过滤它 数据帧: domain tag1 0 ^mail.ru/search Сервис 1 go.mail.ru$ Веб-портал 2 vk.com/audios Социальное 3 vk.
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]$')]
它返回空的数据帧
如何解决此问题?您可以尝试以下方法:
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']
df.domain.str.extract('(?P\w+\)?(?P\w+\。\w+),expand=False)['domain']
为什么要使用这样的范围<代码>\w。另外,转义句点或将其视为通配符:\。
如@TheIncorrigible1所述,对第一组使用[\w-]
,对文字点使用\。
而不是除换行符以外的任何字符(除非使用了s
修饰符)。您也可以对第二组使用[^\W\]
<代码>^[\w-]+\.[^\w\u]$我只需要域,不需要域subdomain@PetrPetrov如果你认为它已经回答了你的问题,请考虑/回答