LINUX.ORG.RU

Выборка в regex не работает

 , ,


1

1

Задача в том, чтобы отфильтровать доменное имя, например, google. Но срабатывает только первое условие: выделить текст после слэша до первой точки. Если в url присутствует www., то оно и выделяется, а не текст после него, как планировалось. Не понимаю, почему не срабатывает условие.


#!/usr/bin/python
#
import re
 
def domain_name(url):

   mystr = re.findall(r'(?<=[/www])\w+(?=\.)', url)

   print(mystr)

domain_name("http://google.co.jp")

https://pastebin.com/8q3CtgSK

Благодарю за любую подсказку, два дня мучаюсь уже!



Последнее исправление: Novichok25 (всего исправлений: 13)
Ответ на: комментарий от kostik87

mystr = re.findall(r’(?<=//)\w+(?=.)’,url)

Когда задается такой url:

domain_name(«http://google.co.jp»)

То выбирается google как задумано. Но когда добавляется к адресу www.google.com, то выходит пустой массив. Как мне задать выборку, чтобы выбиралась либо конструкция //google.com, либо //www.google.com. У меня не получается www.выделить

Novichok25
() автор топика
Ответ на: комментарий от Novichok25
echo "https://google.com" | sed 's/.*\/\/\([a-z0-9\.]*\).*/\1/'
google.com
echo "https://google.com/dfdfdf" | sed 's/.*\/\/\([a-z0-9\.]*\).*/\1/'
google.com
echo "https://www.google.com/dfdfdf" | sed 's/.*\/\/\([a-z0-9\.]*\).*/\1/'
www.google.com

Я не знаю как тебе сделать это на твоём питон, гугли.

kostik87 ★★★★★
()
Ответ на: комментарий от Novichok25

Как тебе уже сказали почитай про регулярные выражения.

По сути регулярное выражение - это шаблон.

Ну и в частности почитай что такое w+.

Разбирайся.

Удачи.

kostik87 ★★★★★
()

Зачем это регуляркой делать?

https://docs.python.org/3/library/urllib.parse.html

from urllib.parse import urlparse

domain = urlparse("http://docs.python.org:80/3/library/urllib.parse.html?").hostname
pi11 ★★★★★
()
Последнее исправление: pi11 (всего исправлений: 1)
Ответ на: комментарий от Novichok25

Извини за такой ответ, но марш бегом (!!!) читать хотя бы стандартную справку по регекспам в официальной доке Python. А еще желательно дополнить книгой Mastering Regular Expressions (есть и перевод на русский).

Ты написал полную белиберду, то есть кое-как набросал символов в строку, совершенно не понимая их значения, и как они работают.

Помочь тебе с правильным выражением - только навредить, ибо этот путь надо пройти самостоятельно.

И вообще, прошу прощения, но вот этот вот подход: «А я щас накидаю символов как попало, и буду случайно менять, пока не заработает, если зайду в тупик - спрошу на форуме» - глубоко порочный. Избавляйся от такого подхода, пока не поздно.

P.S. Почему-то вот этот вот ужасный подход чаще всего встречается в регекспах. По опыту, очень много разработчиков, даже титулованных, считают себя выше необходимости читать доку по регекспам и пишут их точно таким же образом, кидая в строку что попало, пока не заработает.

emorozov
()
Последнее исправление: emorozov (всего исправлений: 1)
Ответ на: комментарий от emorozov

В целом согласен, только вот задача ОПа решается примитивным регвыром. Вечерок достаточно потратить на изучение темы и всё станет понятно. Правда непонятно зачем вообще эту задачу решать регулярным выражением, если есть библиотеки разбирающие урлы?

P.S. ОП, не надо адманывать уважаемых людей. Ты даже не пытался документацию открыть. Иди читай справку.

perl5_guy ★★★★★
()
Ответ на: комментарий от perl5_guy

Да, меня и возмущает, что ОП совершенно очевидно даже не попытался прочитать хотя бы справку по регекспам.

А нужно их знать ещё и затем, что часто встречаются в чужом коде, с которым приходится работать. И часто приходится поправлять за такими вот: «Давайте накидаем в бутылку деталей и будем трясти, пока не получится кораблик».

emorozov
()
Ответ на: комментарий от perl5_guy

Согласен, особенно с учётом того что есть ссылки на языках отличных от английского. Хотел выделаться и кинуть ссылку на RFC по URI, URL, IRI, но там столько смежного говна вылезает в виде полуживых технологий и предложений, что ковыряться в этом всём мне сегодня лень.

peregrine ★★★★★
()
Ответ на: комментарий от perl5_guy

Такое впечатление, что Вы у меня за спиной стояли:) Да, шаблоны собирались по интернету, а потом соединялись. Но благодаря ссылке на песочницу regex вскрылись глупые ошибки:)

Novichok25
() автор топика
Ответ на: комментарий от SpaceRanger

За статью спасибо огромное! Буду вчитываться. Нужно узнать побольше о том, как сделать условие в regex. Правда, за один вечер, как тут говорилось, не получилось. Видимо, рожденный ползать…))

Novichok25
() автор топика
Ответ на: комментарий от Novichok25

Я не знаю python. Поэтому тестировал на pwsh:

 $ & {
 'https://www.google.com' -replace '.+//(w+\.)?|\..+'
 'https://google.com' -replace '.+//(w+\.)?|\..+'
 'https://www.google.com/aaa.bbb' -replace '.+//(w+\.)?|\..+'
 'https://google.com/www.http' -replace '.+//(w+\.)?|\..+'
 }
google
google
google
google
dmitry237 ★★★★
()
Ответ на: комментарий от easybreezy

За ссылки спасибо! В условиях задачи можно пользоваться только встроенными инструментами, сторонние библиотеки нельзя. И мне всегда казалось, что регулярки - это высший пилотаж:)

Novichok25
() автор топика
Ответ на: комментарий от dmitry237

У меня в песочнице для регулярок код работает. Только выделяет он как-раз то, что нужно обрезать, а не сам домен. Я пока не пойму, какой метод там надо использовать вместе с re.

Novichok25
() автор топика
Ответ на: комментарий от Novichok25

В условиях задачи можно пользоваться только встроенными инструментами, сторонние библиотеки нельзя

Если задача из реального мира, то это ты никак без вышеупомянутого дампа не решишь, когда будешь парсить сабдомен(ы) из всяких странных зон.

Some examples of public suffixes are .com, .co.uk and pvt.k12.ma.us.

Если задача какая то по учёбе, то можешь сделать ход конём и спросить экзаменатора как бы он сам стал разбирать такие неочевидные домены.

И мне всегда казалось, что регулярки - это высший пилотаж:)

Да, просто надо понимать, когда их нужно юзать, а когда нет.

easybreezy
()
Ответ на: комментарий от dmitry237

Работает! :) Надо только использовать sub, а не findall.

mystr = re.sub('.+//(w+\.)?|\..+', "", url)

Код выделяет в ссылке ненужные части, которые sub вырезает (меняет на пустое место).

Novichok25
() автор топика
Последнее исправление: Novichok25 (всего исправлений: 2)
Ответ на: комментарий от Novichok25

Вообще-то учиться надо на бумаге — так легче перечитывать и в книге можно рисовать разноцветными карандашами. Это совершенно иной уровень погружения в материал, чем читать с экрана.

Кстати, тебе может и не очень подойдёт Шоттс, если тебе не интересен баш. Может лучше возьмёшь Фицджеральда: https://market.yandex.ru/product--fitsdzherald-maikl-reguliarnye-vyrazheniia-osnovy/1781387867?was_redir=2&cpa=1

Книжка тоненькая, чисто про регулярки, я читал, излагает прямо с нуля и для разных языков делает всякие оговорки.

А вообще Фридл круто в первых главах рассказывает про них, прям красавчик: https://www.chitai-gorod.ru/catalog/book/1055232/

papin-aziat ★★★★★
()
Ответ на: комментарий от Novichok25

Я б всё-таки Фридла посоветовал, первые 6 глав. Я не программист, вообще не технарь, но прочитал их с удовольствием, автор реально смог сделать тему увлекательной.

papin-aziat ★★★★★
()

Примерно вот так:

use strict;
use warnings;
use Data::Dumper;

my @src = (
    'https://www.google.com/home/stone',
    'www.google.com/home/stone',
    'https://www.google.com',
    'www.google.com'

    );

map {
    print $_,"\n";
    my %res = url_parse($_);
    
    print Dumper(\%res);
} @src;

sub url_parse
{
    my ($url) = @_;
    my %res = ();

    {
	my ($prot,$dom,$path) = $url =~ m@^(?:(\w+)(?=://))?(?:://)?([^/]*)(.*)$@g;
	@res{qw/prot dom path/} = ($prot, $dom, $path);
    }
    
    return %res;
}

Итог:

https://www.google.com/home/stone
$VAR1 = {
          'dom' => 'www.google.com',
          'prot' => 'https',
          'path' => '/home/stone'
        };
www.google.com/home/stone
$VAR1 = {
          'path' => '/home/stone',
          'dom' => 'www.google.com',
          'prot' => undef
        };
https://www.google.com
$VAR1 = {
          'prot' => 'https',
          'dom' => 'www.google.com',
          'path' => ''
        };
www.google.com
$VAR1 = {
          'prot' => undef,
          'dom' => 'www.google.com',
          'path' => ''
        };
solom
()