powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Переменные в регулярных выражениях. Perl
17 сообщений из 17, страница 1 из 1
Переменные в регулярных выражениях. Perl
    #38421840
Testor1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем!

Нужен совет с регулярными выражениями

есть строка aq|bs|df|[132-343-34][12-34-96-09]|ere|werw|[324-343][3032-123]

требуется
1) найти в строке выражение которое находиться |[ по ]| или ] конец строки
2) только для данной подстроки применить регулярные выражения (несколько разных) для замены текста.

вопрос как это сделать правильно ?

Я использую регулярное выражение для поиска подстроки и замены, но мне кажется, такой подход не корректный с точки зрения производительности.
...
Рейтинг: 0 / 0
Переменные в регулярных выражениях. Perl
    #38422183
Testor1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привожу пример из реальной задачи.

Ниже приведенный код работает корректно, но медленно.
Как его можно оптимизировать ?
Самое плохое, что код четыре раза сканирует строку в поиске подстроки вида [число~число~число(~число)?] в целой строке

столбец1|столбец2|столбец3|[число1~число2~число3(~число4)?] |столбец4|столбец5

суть выражений для числа2 и числа3 удалить незначащие нули после запятой.
например
123.000 -> 123
123.450 -> 123.45

while($file_line=<STDIN>)
{

for($file_line)
{
s/(\[\d+\~-?\d*\.?\d*~-?\d*)(\.0*)?(~\d*)?(\])/\1\3\4/g;
s/(\[\d+\~-?\d*)(\.0*)?(~-?\d*\.?\d*)?(~\d*)?(\])/\1\3\4\5/g;

s/(\[\d+\~-?\d*\.?\d*-?~\d+\.\d*[1-9])(0+)(~\d*)?(\])/\1\3\4/g;
s/(\[\d+\~-?\d*\.?\d*[1-9])(0+)(~-?\d*\.?\d*)(~\d*)?(\])/\1\3\4\5/g;

}
print STDOUT $file_line;
}
...
Рейтинг: 0 / 0
Переменные в регулярных выражениях. Perl
    #38422965
S_Andrey_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
aq|bs|df|[132-343-34][12-34-96-09]|ere|werw|[324-343][3032-123]


где тут нули и где запятые?

Напиши реальную строчку и что из нее нужно получить.
...
Рейтинг: 0 / 0
Переменные в регулярных выражениях. Perl
    #38423341
Testor1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
S_Andrey_A
Код: plsql
1.
aq|bs|df|[132-343-34][12-34-96-09]|ere|werw|[324-343][3032-123]


где тут нули и где запятые?

Напиши реальную строчку и что из нее нужно получить.

aq|bs|df|[132-343.0200-34.0000][12-34.0000100-96.00000-9]|ere|werw|[324-343-232.000][3032-123.0000-100.0000]

должно получиться
aq|bs|df|[132-343.02-34[12-34.00001-96-9]|ere|werw|[324-343-232][3032-123-100]
...
Рейтинг: 0 / 0
Переменные в регулярных выражениях. Perl
    #38424006
S_Andrey_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут нолики обрубаются во всех полях, а не только во втором и третьем...
Если так и надо то сильвупле:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
#!/usr/bin/perl
use strict;
my $str='';

$str='aq|bs|df|[132-343.0200-34.0000][12-34.0000100-96.00000-9]|ere|werw|[324-343-232.000][3032-123.0000-100.0000]';

print "\n$str";
$str=~ s/(\d+\.\d+)/$1*1/ge;
print "\n$str";
print "\n";
-----------------------------------------
aq|bs|df|[132-343.0200-34.0000][12-34.0000100-96.00000-9]|ere|werw|[324-343-232.000][3032-123.0000-100.0000]
aq|bs|df|[132-343.02-34][12-34.00001-96-9]|ere|werw|[324-343-232][3032-123-100]
...
Рейтинг: 0 / 0
Переменные в регулярных выражениях. Perl
    #38424575
Testor1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
S_Andrey_AТут нолики обрубаются во всех полях, а не только во втором и третьем...
Если так и надо то сильвупле:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
#!/usr/bin/perl
use strict;
my $str='';

$str='aq|bs|df|[132-343.0200-34.0000][12-34.0000100-96.00000-9]|ere|werw|[324-343-232.000][3032-123.0000-100.0000]';

print "\n$str";
$str=~ s/(\d+\.\d+)/$1*1/ge;
print "\n$str";
print "\n";
-----------------------------------------
aq|bs|df|[132-343.0200-34.0000][12-34.0000100-96.00000-9]|ere|werw|[324-343-232.000][3032-123.0000-100.0000]
aq|bs|df|[132-343.02-34][12-34.00001-96-9]|ere|werw|[324-343-232][3032-123-100]




Спасибо за поддержку

Не могу понять по регуляторному выражению, какая его часть отвечает за удаление 0 после дробной части
(\d+\.\d+)- выбираем все числа с разделителем знака
$1 - оставляем группу. то есть должно скопироваться исходное число как есть.
а почему нолики должны удалиться?


нужно удалять нолики для
1) заданных столбцов CSV строки
2) только после разделителя дробной части для второго и третьего числа внутри квадратных скобок

Как это сделать ? Можешь помочь?
...
Рейтинг: 0 / 0
Переменные в регулярных выражениях. Perl
    #38424626
S_Andrey_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Testor1

Спасибо за поддержку

Не могу понять по регуляторному выражению, какая его часть отвечает за удаление 0 после дробной части
(\d+\.\d+)- выбираем все числа с разделителем знака
$1 - оставляем группу. то есть должно скопироваться исходное число как есть.
а почему нолики должны удалиться?


нужно удалять нолики для
1) заданных столбцов CSV строки
2) только после разделителя дробной части для второго и третьего числа внутри квадратных скобок

Как это сделать ? Можешь помочь?
я тупо привожу строчку к числу путем умножения его на 1 _)))
Править только заданные поля одной регуляркой, боюсь получится геморойно... Если вообще получится... Я бы бил строчку split на поля и уже в нужных полях все обрезал, потом собирал строчку назад. Если такой вариант подойдет - можно сделать._)
...
Рейтинг: 0 / 0
Переменные в регулярных выражениях. Perl
    #38424629
Testor1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
S_Andrey_ATestor1
Спасибо за поддержку

Не могу понять по регуляторному выражению, какая его часть отвечает за удаление 0 после дробной части
(\d+\.\d+)- выбираем все числа с разделителем знака
$1 - оставляем группу. то есть должно скопироваться исходное число как есть.
а почему нолики должны удалиться?


нужно удалять нолики для
1) заданных столбцов CSV строки
2) только после разделителя дробной части для второго и третьего числа внутри квадратных скобок

Как это сделать ? Можешь помочь?
я тупо привожу строчку к числу путем умножения его на 1 _)))
Править только заданные поля одной регуляркой, боюсь получится геморойно... Если вообще получится... Я бы бил строчку split на поля и уже в нужных полях все обрезал, потом собирал строчку назад. Если такой вариант подойдет - можно сделать._)

Пойдет, для первичного анализа. Потом буду оптимизировать.
В c# сплит очень медленная функция :(
...
Рейтинг: 0 / 0
Переменные в регулярных выражениях. Perl
    #38425131
Testor1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
S_Andrey_A,

С твоей помощью написал нужный код.
Теперь надо придумать как оптимизировать его по производительности.


#!/usr/bin/perl
my $str='';

$str='aq|bs|df|[132~343.0200~34.0000][12~-34.0000100~0.000~9]|ere|werw|[324~-343~232.0001001][3032~123.0000~-100.000010]';


@index = (3,6);

@a = split /\|/, $str;

print "\n$str";
print "\n@a";

foreach $arg(@index)
{
print "\nList item: @a[$arg]\n";
@a[$arg]=~s/(\d*\.\d*)/$1*1/ge;
@a[$arg]=~s/\[(([2-9]~)|(\d\d+~))(-?\d*(\.\d*)?~0)(~\d*)?\]//g;
print "\nList item: @a[$arg]\n";

}

$str = join("|",@a);

print "\n$str";
print "\n";

p.s.
Какой ты выбираешь SRC при вставке кода? там же нет perl.
...
Рейтинг: 0 / 0
Переменные в регулярных выражениях. Perl
    #38427030
S_Andrey_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Testor1,

Регулярки в Perl самые регулярные _) Несколько простых, будут работать(в общем случае) быстрее чем одна навороченная и если ты не микроконтроллер программишь, наврядли есть смысл запариваться о производительности (в разумных конечно же пределах_))

В твоем примере все же не понятно что значит "дробные числа во 2 и 3 числе в скобках"
Сколько скобок бывает? Могут ли быть дробные числа в других позициях? Сколько вообще чисел может быть в скобках?
Я бы сначала разбирал все по полям (split /|/), и потом поля разбирал на конкретные числа - обрабатывал нужные числа и собирал все в зад.
Но если ты уверен, что нужно менять именно конкретные числа в конкретных позициях - то можно конечно захардкодить обработку только этих символов... Но опять же (ИМХО) лучше написать несколько простых регулярок чем городить мегадлинную.
...
Рейтинг: 0 / 0
Переменные в регулярных выражениях. Perl
    #38427245
Testor1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
S_Andrey_ATestor1,

Регулярки в Perl самые регулярные _) Несколько простых, будут работать(в общем случае) быстрее чем одна навороченная и если ты не микроконтроллер программишь, наврядли есть смысл запариваться о производительности (в разумных конечно же пределах_))

В твоем примере все же не понятно что значит "дробные числа во 2 и 3 числе в скобках"
Сколько скобок бывает? Могут ли быть дробные числа в других позициях? Сколько вообще чисел может быть в скобках?
Я бы сначала разбирал все по полям (split /|/), и потом поля разбирал на конкретные числа - обрабатывал нужные числа и собирал все в зад.
Но если ты уверен, что нужно менять именно конкретные числа в конкретных позициях - то можно конечно захардкодить обработку только этих символов... Но опять же (ИМХО) лучше написать несколько простых регулярок чем городить мегадлинную.

Я тут начал потихоньку вникать в суть перл-А


[132~343.0200~34.0000]
первое число 132 - ID-ишка
второе число некая величина - 343.0200
третье число некая величина - 34.0000

мне нужно исключить незначащие нули для второго и третьего числа внутри скобок.
более того, если третье число равно нулю, то в этом случае удалить все выражение внутри текущих квадратных скобок [].

в заданных столбцах csv файла могут размещаются выражения в скобках. в одном столбце может быть разное число выражений в скобках.

Кол-во строк в файле более 100 миллионов.

Я оптимизировать.

По логике вещей самый быстрый вариант, если регулярка обработает строку за один раз.
Пытаюсь понять на сколько это возможно технически. Возможно ли использовать условия и т.д.
...
Рейтинг: 0 / 0
Переменные в регулярных выражениях. Perl
    #38427663
S_Andrey_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Testor1,

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

Добавив цикл по полям строчки, у тебя будет фиксированное число итераций + пара элементарных замен s//. В то время как метровый регэксп может шариться по этой же строчке достаточно долго. И вероятность ошибок в солжных регэкспах велика, не говоря уже о внесении в них изменений
...
Рейтинг: 0 / 0
Переменные в регулярных выражениях. Perl
    #38432326
Testor1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
S_Andrey_ATestor1,

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

Добавив цикл по полям строчки, у тебя будет фиксированное число итераций + пара элементарных замен s//. В то время как метровый регэксп может шариться по этой же строчке достаточно долго. И вероятность ошибок в солжных регэкспах велика, не говоря уже о внесении в них изменений

Сплит - плохая идея. Тормозит процесс.
Думаю может найти m/ нужный кусок. Отдельно его обработать, а потом заменить просто.
...
Рейтинг: 0 / 0
Переменные в регулярных выражениях. Perl
    #38432878
Testor1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Testor1,

Как сделать замену в зависимости от найденного значения?

Если встретиться слово кошка, то заменить это слово на черная,
если встретиться слово собака, то заменит это слово на белая

s/(кошка|собака)/????/g
...
Рейтинг: 0 / 0
Переменные в регулярных выражениях. Perl
    #38433084
S_Andrey_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Testor1,

авторСплит - плохая идея. Тормозит процесс.
Думаю может найти m/ нужный кусок. Отдельно его обработать, а потом заменить просто.


авторКак сделать замену в зависимости от найденного значения?
Если встретиться слово кошка, то заменить это слово на черная,
если встретиться слово собака, то заменит это слово на белая


Т.е. по твоему вторая идея хорошая? _)) Тогда я пас _)
Если серьезно split наврядли будет занимает какое то ощутимое время. Тебе нужно переписать over100.000.000 строк - те полностью перезаписать файл, имхо основное время уйдет на ввод/вывод, а не на разбор строк...

Ради эксперимента сделай построчное чтение /запись и тоже самое со сплитом и парой замен s//
...
Рейтинг: 0 / 0
Переменные в регулярных выражениях. Perl
    #38433147
Testor1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
S_Andrey_ATestor1,

авторСплит - плохая идея. Тормозит процесс.
Думаю может найти m/ нужный кусок. Отдельно его обработать, а потом заменить просто.


авторКак сделать замену в зависимости от найденного значения?
Если встретиться слово кошка, то заменить это слово на черная,
если встретиться слово собака, то заменит это слово на белая


Т.е. по твоему вторая идея хорошая? _)) Тогда я пас _)
Если серьезно split наврядли будет занимает какое то ощутимое время. Тебе нужно переписать over100.000.000 строк - те полностью перезаписать файл, имхо основное время уйдет на ввод/вывод, а не на разбор строк...

Ради эксперимента сделай построчное чтение /запись и тоже самое со сплитом и парой замен s//

Так и сделал.
9 ГБ файл. без сплита работал 24 минуты. А в случае сплита 42 минуты.

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

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

Как сделать замену в зависимости от найденного значения?

Если встретиться слово кошка, то заменить это слово на черная,
если встретиться слово собака, то заменит это слово на белая

s/(кошка|собака)/????/g


perl -pE ' s/(cat|dog)/if($1 eq "cat"){"black"}elsif($1 eq "dog"){"white"}/e'
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Переменные в регулярных выражениях. Perl
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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