powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Извлечь самую большую группу регексом (regex)
18 сообщений из 18, страница 1 из 1
Извлечь самую большую группу регексом (regex)
    #38505637
kamakama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Есть некая строка вида
'Опубликовано новое постановление Правительства Российской Федерации о штрафах'. Нужно извлечь из нее регексом все подстроки, состоящие только из слов с большими буквами без дублей.
Сейчас использую регекс '(([A-ZА-Я]+[a-z0-9а-я]*[\s\.]){2,})', он извлекает то ,что нужно + шлак в виде последнего слова ( то есть дает 2 совпадения 'Правительства Российской Федерации' и 'Федерации ', оставить нужно только 'Правительства России '). Его нужно отсечь. Как это сделать? В моем понимании, для этого нужно оперировать группами ,но я не могу понять как. Заранее спасибо.
Язык процедуры Pl/Perl, то есть regex с пред- и пост-условиями доступны.
...
Рейтинг: 0 / 0
Извлечь самую большую группу регексом (regex)
    #38505671
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kamakama,

Код: plaintext
1.
2.
$ perl -Mutf8 -CS -e '$s="Опубликовано новое постановление Правительства Российской Федерации о штрафах"; while ($s=~/(([A-ZА-Я]+[a-z0-9а-я]*[\s\.]){2,})/g) { print "$1\n"; }'
Правительства Российской Федерации 
а где «Федерации»?
...
Рейтинг: 0 / 0
Извлечь самую большую группу регексом (regex)
    #38505735
kamakama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ёш,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
drop function if exists perl_regex_matches(text, text);
CREATE OR REPLACE FUNCTION perl_regex_matches(text, text)
  RETURNS SETOF text[] AS
    /*$1 - где ищем
$2 - что ищем
*/

$BODY$
	my ($sentense, $regexp) = @_;
	my @values = $sentense =~ /$regexp/g;
	return [ \@values ];
$BODY$
  LANGUAGE plperl VOLATILE
  COST 100
  ROWS 1000;
ALTER FUNCTION perl_regex_matches(text, text)
  OWNER TO postgres;
drop function if exists perl_regex_matches_t(text, text);
CREATE OR REPLACE FUNCTION perl_regex_matches_t(text, text)
  RETURNS SETOF text AS
    /*$1 - где ищем
$2 - что ищем
*/
$BODY$
	my ($sentense, $regexp) = @_;
	my @values = $sentense =~ /$regexp/g;
	return \@values;
$BODY$
  LANGUAGE plperl VOLATILE
  COST 100
  ROWS 1000;

do language plpgsql
$$
declare _w text;
declare _b text[];
declare _w1 text;
declare _reg text;
declare c cursor for select * from perl_regex_matches_t(_w,_reg) m;
declare r record;
begin
  _w = ' Опубликовано новое постановление Правительства Российской Федерации о штрафах ';
  _reg = '(([A-ZА-Я]+[a-z0-9а-я]*[\s\.]){2,})';
  raise notice '_w %',_w;
  select m into _b from perl_regex_matches(_w,_reg) m where m is not null;
  raise notice '_b %',_b;
end;
$$


вывод
Код: sql
1.
2.
NOTICE:  _w  Опубликовано новое постановление Правительства Российской Федерации о штрафах
NOTICE:  _b {"Правительства Российской Федерации ","Федерации "}
...
Рейтинг: 0 / 0
Извлечь самую большую группу регексом (regex)
    #38505738
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kamakama,

квантификатор {1, 2 } <Опубликовано>, <Правительства Российской> <Федерации>
квантификатор {2,} <Правительства Российской Федерации>
квантификатор {2,2} <Правительства Российской>


'шлака' замечено не было, как РВ было написано, так и работает
...
Рейтинг: 0 / 0
Извлечь самую большую группу регексом (regex)
    #38505739
kamakama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сам по перлу не спец, поэтому функции написали другие люди
...
Рейтинг: 0 / 0
Извлечь самую большую группу регексом (regex)
    #38505745
kamakama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
volodin661,

Это я в общем-то понимаю, мне нужно придумать регулярку, которая будет выделять только одну строчку, самую длиную с заглавнями буквами, без вхождений. Я смог придумать только такую.
Если Вы можете предложить правильную, то буду премного благодарен
...
Рейтинг: 0 / 0
Извлечь самую большую группу регексом (regex)
    #38505822
Гость_0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kamakama, у Вас две пары скобок в регулярке и соответственно две группы, зачем Вы их обе берёте из _b? Берите только внешнюю (первую) группу, то есть _b [0]
...
Рейтинг: 0 / 0
Извлечь самую большую группу регексом (regex)
    #38505832
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kamakama,

Код: perl
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE OR REPLACE FUNCTION Aa_Bb_Cc(text) RETURNS TEXT AS $$
    
    use utf8;

    my $arg = shift;

    return undef if (!defined $arg);

    $arg =~ m{ (
                  ( [A-ZА-Я]+
                    [a-z0-9а-я]*
                    [ \s ]
                  ){2,} 
               )
             }x;

    return $1;



Вот так возвращает ---> Правительства Российской Федерации
при строке -->Опубликовано новое постановление Правительства Российской Федерации о штрафах


( проверял из ком. строки, из pgsql не проверял )
...
Рейтинг: 0 / 0
Извлечь самую большую группу регексом (regex)
    #38505852
kamakama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
volodin661,

Фишка в том, что я в цикле текст обрабатываю разными регулярками. И брать какое-то конкретное совпадение для конкретной регулярки ну никак не укладывается в логику работы кода, полчается явный костыль. Тем более, если совпадений будет несколько - брать только четные, что ли?
...
Рейтинг: 0 / 0
Извлечь самую большую группу регексом (regex)
    #38505854
kamakama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
volodin661,

А можете написать точно саму регулярку из примера в кавычках водну строку? а то с разбиением не могу понять что к чему.
...
Рейтинг: 0 / 0
Извлечь самую большую группу регексом (regex)
    #38506440
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kamakamavolodin661,

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


так эта то же РВ, которое было у тебя в старт-топике

Код: perl
1.
$arg =~ m{ (  ( [A-ZА-Я]+[a-z0-9а-я]*[ \s ]){2,} )  }x;



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

Что касается второго аргумента функции Aa_Bb_Cc(text), то это тоже
было сознательное решение :-) ;
я бы не передавал РВ аргументом,
а оформлял бы свою функцию под каждый случай, так построже будет.
...
Рейтинг: 0 / 0
Извлечь самую большую группу регексом (regex)
    #38506623
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kamakamaбрать какое-то конкретное совпадение для конкретной регулярки ну никак не укладывается...
тогда группируйте, но не запоминайте

perldoc perlre
Код: plaintext
1.
2.
3.
       "(?:pattern)"
       "(?adluimsx-imsx:pattern)"
       "(?^aluimsx:pattern)"
                 This is for clustering, not capturing
...
Рейтинг: 0 / 0
Извлечь самую большую группу регексом (regex)
    #38507873
kamakama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBat,

настолько не разбираюсь в регулярках, чтоб это понять. А можете показать, как поменять мою конструкцию с использованием этого кода?
...
Рейтинг: 0 / 0
Извлечь самую большую группу регексом (regex)
    #38508039
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(( ?: [A-ZА-Я]+[a-z0-9а-я]*[\s\.]){2,})
...
Рейтинг: 0 / 0
Извлечь самую большую группу регексом (regex)
    #38508363
kamakama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBat,

Спасибо, работает. А где можно почитать на русском описание регексов поподробней? А то имеющиеся скудные.

ПС. Некоторое развитие задачи, и, как я думаю, с похожим решением - из строки нужно выбирать названия предприятий с формой собственности. Пример - генеральный директор ФГУП "Атомфлот" Госкорпорации «Росатом», регекс ((ОАО|ЗАО|ООО|ФГУП|ФКП)\s[A-Za-z0-9а-яА-Я"«»]+) выдает {"ФГУП Атомфлот",ФГУП}. Как откинуть последний ФГУП?
...
Рейтинг: 0 / 0
Извлечь самую большую группу регексом (regex)
    #38509066
Ы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ы
Гость
kamakama,

В общем случае ваша задача о правительстве и предприятиях — не для регулярных выражений. Добро пожаловать в мир NLP, читайте про named entity recognition (распознавание именованных сущностей).
...
Рейтинг: 0 / 0
Извлечь самую большую группу регексом (regex)
    #38509073
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kamakama
регекс ((ОАО|ЗАО|ООО|ФГУП|ФКП)\s[A-Za-z0-9а-яА-Я"«»]+) выдает {"ФГУП Атомфлот",ФГУП}. Как откинуть последний ФГУП?

kamakama,

уже писали, что не воспроизводится этот эффект, если посмотреть на вывод просто из Perl. Нет у нас ни лишней федерации, ни лишнего ФГУПа...
нет. проверь сам.
...
Рейтинг: 0 / 0
Извлечь самую большую группу регексом (regex)
    #38510033
kamakama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
volodin661,

Странно, что не воспроизводиться. А вот на смешанных языках (см. пост в начале) такой эффект есть. Может быть, чистый перл отсекает только первое вхождение, а при вызове из функции он возвращает все группы?
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Извлечь самую большую группу регексом (regex)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]