+ Ответить в теме
Показано с 1 по 5 из 5

Тема: Регулярные выражения

  1. #1
    АлинаБалаева is on a distinguished road
    Регистрация
    10.01.2018
    Сообщений
    2
    Вес репутации
    0

    По умолчанию Регулярные выражения

    Добрый день, уважаемые форумчане!
    Помогите, пожалуйста, решить проблему:
    есть строка вида
    143301, обл. Московская, г. Дмитров, ул. Сиреневая, д. 50
    или
    обл. Московская, г. Дмитров, ул. Сиреневая, д. 50
    Ее нужно привести к такому виду:
    Дмитров Сиреневая 50.
    При этом вместо Московской области может быть любая другая, либо край, либо республика. Так же есть вероятность, что обозначения субъекта РФ впринципе не будет, что-то вроде "125009, г. Москва, ул. Тверская, д. 4". Вместо улицы может быть переулок, проезд, тупик, бульвар и т.д. Вместо города, соответственно, может быть любой другой, не факт, что город, но населенный пункт(г. , п. , с. , д. , etc).
    Понимаю: задача может быть решена регулярными выражениями.
    Не понимаю: регулярных выражений. Сижу с ними уже недели две. Мозг упорно отказывается вникнуть в материал.
    Очень прошу, помогите! Голова скоро лопнет

  2. По умолчанию

     
    Хотите избавиться от рекламы? Зарегистрируйтесь
  3. #2
    Moderator Куратор
    system architect
    dr.Jekill will become famous soon enough dr.Jekill will become famous soon enough
    Регистрация
    03.01.2009
    Адрес
    Voronezh
    Сообщений
    507
    Вес репутации
    12

    По умолчанию

    Сделайте токенизацию по запятой. У Вас получится что-то вроде следующих частей:
    143301
    обл. Московская
    г. Дмитров
    ул. Сиреневая
    д. 50
    Далее проверяйте каждый токен по набору правил. Напр. индекс вообще можно легко отбросить по простому правилу - является ли токен числом, если да, то это индекс и его можно отбросить.
    Нашли сущность (напр. индекс) пометили, что сущность данного типа найдена. Далее обрабатываете оставшиеся токены по правилам оставшихся сущностей.
    Это если реализовать на основе правил без использования сторонних сервисов.
    ---
    Так же для решения данной задачи можно использовать машинное обучение (named entity extraction, named entity recognition). Реализовать самому или использовать напр. dialogflow от гугл.

    Вы какой язык программирования используете?
    Последний раз редактировалось dr.Jekill; 11.01.2018 в 19:10.
    Нет религии выше истины

  4. #3
    АлинаБалаева is on a distinguished road
    Регистрация
    10.01.2018
    Сообщений
    2
    Вес репутации
    0

    По умолчанию Re: Регулярные выражения

    Использую C#, но я начинающая, самоучка, читала Шилдта, но как-то не очень просто он пишет

  5. #4
    Moderator Куратор
    system architect
    dr.Jekill will become famous soon enough dr.Jekill will become famous soon enough
    Регистрация
    03.01.2009
    Адрес
    Voronezh
    Сообщений
    507
    Вес репутации
    12

    По умолчанию Re: Регулярные выражения

    Задача в целом, если делать на основе правил, не сложная и, думаю, Вы справитесь ) Ждём Вашего кода в теме
    Нет религии выше истины

  6. #5
    Moderator Куратор
    system architect
    dr.Jekill will become famous soon enough dr.Jekill will become famous soon enough
    Регистрация
    03.01.2009
    Адрес
    Voronezh
    Сообщений
    507
    Вес репутации
    12

    Lightbulb Re: Регулярные выражения

    К сожалению синтаксис C# плохо помню. Вот сделал Вам небольшой пример на PHP:
    PHP код:
    <?php
        
    function isAnyParam($token$keys$part_after_key_must_num false) {
            
    $finded false;
            foreach(
    $keys as $key
                if (
    $key != "")    {
                    
    $pos strpos($token$key);
                    if ((
    $pos !== false) && ($pos == 0)) {
                        
    $part_after_key substr($tokenstrlen($key));
                        if (
    is_numeric($part_after_key) == $part_after_key_must_num) {
                            
    $finded true;
                            break;
                        }
                    }
                } else if (
    is_numeric($token) == $part_after_key_must_num) {
                    
    $finded true;
                    break;
                }
            return 
    $finded;
        }

        
    $params = array(
                array(
                    
    "name" => "Индекс"
                    
    "keys" => array(""),
                    
    "part_after_key_must_num" => true,
                    
    "finded" => false
                
    ),
                array(
                    
    "name" => "Регион"
                    
    "keys" => array("обл. ""край ",  "республика "),
                    
    "part_after_key_must_num" => false,
                    
    "finded" => false
                
    ),
                array(
                    
    "name" => "Населенный пункт"
                    
    "keys" => array("г. ""п. ""с. ""д. "),
                    
    "part_after_key_must_num" => false,
                    
    "finded" => false
                
    ),
                array(
                    
    "name" => "Улица"
                    
    "keys" => array("ул. ""переулок ""проезд ""тупик ""бульвар "),
                    
    "part_after_key_must_num" => false,
                    
    "finded" => false
                
    ),
                array(
                    
    "name" => "Дом"
                    
    "keys" => array("д. "),
                    
    "part_after_key_must_num" => true,
                    
    "finded" => false
                
    )
        );
        
        
    $s '143301, обл. Тверская, д. Дмитровка, переулок Южный, д. 10';
        echo 
    "<b>".$s."</b><hr />";
        
        
    $tokens explode(','$s);
        foreach(
    $tokens as $token)
            foreach(
    $params as &$param
                if (!
    $param["finded"]) 
                    if (
    isAnyParam(trim($token), $param["keys"], $param["part_after_key_must_num"])) {
                        
    $param["finded"] = true;
                        echo 
    $param["name"].": ".trim($token)."<br />";
                        break;
                    }
    ?>
    Результат работы скрипта:
    143301, обл. Тверская, д. Дмитровка, переулок Южный, д. 10
    Индекс: 143301
    Регион: обл. Тверская
    Населенный пункт: д. Дмитровка
    Улица: переулок Южный
    Дом: д. 10
    Думаю идея понятная. После извлечения расставить параметры в необходимом Вам порядке не составит труда.
    Последний раз редактировалось dr.Jekill; 11.01.2018 в 20:26. Причина: Добавил результат работы скрипта

+ Ответить в теме

Похожие темы

  1. Регулярные выражения в С++
    Обыскал все и вся, но ничего толкового не нашел. Есть ли в С++ возможность проверки регулярных выражений штатными средствами? Или только из...
    от Dragon в разделе C и C++
  2. Регулярные выражения
    Какие книги вы можете предложить по регулярным выражениям?
    от WarMaster в разделе Вопрошайка
  3. Регулярные выражения
    Подскажите пожалуйста, не селён в рег. выражениях, как использую регулярные выражения вытянуть из строки последовательность выражений после каждой...
    от Richard в разделе Java
  4. Регулярные выражения
    Подскажите пожалуйста, мне нужно найти в строке выражение вида и заменить его на <font color=10af7c>. Ну как видно мне это нужно для замены...
    от pashtet в разделе Perl, PHP, ASP ...
  5. Регулярные выражения в Delphi...
    Имеются ли в Delphi средства, для обработки текста, на подобии регулярных выражений (например как в Perl 8) )?
    от Stalker в разделе Delphi и Pascal

Метки этой темы

Ваши права

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