Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Переменные в регулярных выражениях. Perl
|
|||
|---|---|---|---|
|
#18+
Привет всем! Нужен совет с регулярными выражениями есть строка aq|bs|df|[132-343-34][12-34-96-09]|ere|werw|[324-343][3032-123] требуется 1) найти в строке выражение которое находиться |[ по ]| или ] конец строки 2) только для данной подстроки применить регулярные выражения (несколько разных) для замены текста. вопрос как это сделать правильно ? Я использую регулярное выражение для поиска подстроки и замены, но мне кажется, такой подход не корректный с точки зрения производительности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2013, 16:50 |
|
||
|
Переменные в регулярных выражениях. Perl
|
|||
|---|---|---|---|
|
#18+
Привожу пример из реальной задачи. Ниже приведенный код работает корректно, но медленно. Как его можно оптимизировать ? Самое плохое, что код четыре раза сканирует строку в поиске подстроки вида [число~число~число(~число)?] в целой строке столбец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; } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2013, 22:59 |
|
||
|
Переменные в регулярных выражениях. Perl
|
|||
|---|---|---|---|
|
#18+
Код: plsql 1. где тут нули и где запятые? Напиши реальную строчку и что из нее нужно получить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2013, 14:24 |
|
||
|
Переменные в регулярных выражениях. Perl
|
|||
|---|---|---|---|
|
#18+
S_Andrey_A Код: plsql 1. где тут нули и где запятые? Напиши реальную строчку и что из нее нужно получить. 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] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2013, 17:14 |
|
||
|
Переменные в регулярных выражениях. Perl
|
|||
|---|---|---|---|
|
#18+
Тут нолики обрубаются во всех полях, а не только во втором и третьем... Если так и надо то сильвупле: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2013, 09:44 |
|
||
|
Переменные в регулярных выражениях. Perl
|
|||
|---|---|---|---|
|
#18+
S_Andrey_AТут нолики обрубаются во всех полях, а не только во втором и третьем... Если так и надо то сильвупле: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Спасибо за поддержку Не могу понять по регуляторному выражению, какая его часть отвечает за удаление 0 после дробной части (\d+\.\d+)- выбираем все числа с разделителем знака $1 - оставляем группу. то есть должно скопироваться исходное число как есть. а почему нолики должны удалиться? нужно удалять нолики для 1) заданных столбцов CSV строки 2) только после разделителя дробной части для второго и третьего числа внутри квадратных скобок Как это сделать ? Можешь помочь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2013, 15:21 |
|
||
|
Переменные в регулярных выражениях. Perl
|
|||
|---|---|---|---|
|
#18+
Testor1 Спасибо за поддержку Не могу понять по регуляторному выражению, какая его часть отвечает за удаление 0 после дробной части (\d+\.\d+)- выбираем все числа с разделителем знака $1 - оставляем группу. то есть должно скопироваться исходное число как есть. а почему нолики должны удалиться? нужно удалять нолики для 1) заданных столбцов CSV строки 2) только после разделителя дробной части для второго и третьего числа внутри квадратных скобок Как это сделать ? Можешь помочь? я тупо привожу строчку к числу путем умножения его на 1 _))) Править только заданные поля одной регуляркой, боюсь получится геморойно... Если вообще получится... Я бы бил строчку split на поля и уже в нужных полях все обрезал, потом собирал строчку назад. Если такой вариант подойдет - можно сделать._) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2013, 15:52 |
|
||
|
Переменные в регулярных выражениях. Perl
|
|||
|---|---|---|---|
|
#18+
S_Andrey_ATestor1 Спасибо за поддержку Не могу понять по регуляторному выражению, какая его часть отвечает за удаление 0 после дробной части (\d+\.\d+)- выбираем все числа с разделителем знака $1 - оставляем группу. то есть должно скопироваться исходное число как есть. а почему нолики должны удалиться? нужно удалять нолики для 1) заданных столбцов CSV строки 2) только после разделителя дробной части для второго и третьего числа внутри квадратных скобок Как это сделать ? Можешь помочь? я тупо привожу строчку к числу путем умножения его на 1 _))) Править только заданные поля одной регуляркой, боюсь получится геморойно... Если вообще получится... Я бы бил строчку split на поля и уже в нужных полях все обрезал, потом собирал строчку назад. Если такой вариант подойдет - можно сделать._) Пойдет, для первичного анализа. Потом буду оптимизировать. В c# сплит очень медленная функция :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2013, 15:55 |
|
||
|
Переменные в регулярных выражениях. Perl
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2013, 11:05 |
|
||
|
Переменные в регулярных выражениях. Perl
|
|||
|---|---|---|---|
|
#18+
Testor1, Регулярки в Perl самые регулярные _) Несколько простых, будут работать(в общем случае) быстрее чем одна навороченная и если ты не микроконтроллер программишь, наврядли есть смысл запариваться о производительности (в разумных конечно же пределах_)) В твоем примере все же не понятно что значит "дробные числа во 2 и 3 числе в скобках" Сколько скобок бывает? Могут ли быть дробные числа в других позициях? Сколько вообще чисел может быть в скобках? Я бы сначала разбирал все по полям (split /|/), и потом поля разбирал на конкретные числа - обрабатывал нужные числа и собирал все в зад. Но если ты уверен, что нужно менять именно конкретные числа в конкретных позициях - то можно конечно захардкодить обработку только этих символов... Но опять же (ИМХО) лучше написать несколько простых регулярок чем городить мегадлинную. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 17:45 |
|
||
|
Переменные в регулярных выражениях. Perl
|
|||
|---|---|---|---|
|
#18+
S_Andrey_ATestor1, Регулярки в Perl самые регулярные _) Несколько простых, будут работать(в общем случае) быстрее чем одна навороченная и если ты не микроконтроллер программишь, наврядли есть смысл запариваться о производительности (в разумных конечно же пределах_)) В твоем примере все же не понятно что значит "дробные числа во 2 и 3 числе в скобках" Сколько скобок бывает? Могут ли быть дробные числа в других позициях? Сколько вообще чисел может быть в скобках? Я бы сначала разбирал все по полям (split /|/), и потом поля разбирал на конкретные числа - обрабатывал нужные числа и собирал все в зад. Но если ты уверен, что нужно менять именно конкретные числа в конкретных позициях - то можно конечно захардкодить обработку только этих символов... Но опять же (ИМХО) лучше написать несколько простых регулярок чем городить мегадлинную. Я тут начал потихоньку вникать в суть перл-А [132~343.0200~34.0000] первое число 132 - ID-ишка второе число некая величина - 343.0200 третье число некая величина - 34.0000 мне нужно исключить незначащие нули для второго и третьего числа внутри скобок. более того, если третье число равно нулю, то в этом случае удалить все выражение внутри текущих квадратных скобок []. в заданных столбцах csv файла могут размещаются выражения в скобках. в одном столбце может быть разное число выражений в скобках. Кол-во строк в файле более 100 миллионов. Я оптимизировать. По логике вещей самый быстрый вариант, если регулярка обработает строку за один раз. Пытаюсь понять на сколько это возможно технически. Возможно ли использовать условия и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 20:54 |
|
||
|
Переменные в регулярных выражениях. Perl
|
|||
|---|---|---|---|
|
#18+
Testor1, Сложная регулярка (с множеством шаблонов, условий и пр) не обработает строку за один проход! Парсер так же будет читать ее много-много раз ища всевозможные варианты для совпадения! Поэтому я и говорю, что часто, выгоднее и сточки зрения производительности и с точки зрения скорости разработки и затрат на сопровождение, написать несколько простых регулярок. Добавив цикл по полям строчки, у тебя будет фиксированное число итераций + пара элементарных замен s//. В то время как метровый регэксп может шариться по этой же строчке достаточно долго. И вероятность ошибок в солжных регэкспах велика, не говоря уже о внесении в них изменений ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2013, 10:15 |
|
||
|
Переменные в регулярных выражениях. Perl
|
|||
|---|---|---|---|
|
#18+
S_Andrey_ATestor1, Сложная регулярка (с множеством шаблонов, условий и пр) не обработает строку за один проход! Парсер так же будет читать ее много-много раз ища всевозможные варианты для совпадения! Поэтому я и говорю, что часто, выгоднее и сточки зрения производительности и с точки зрения скорости разработки и затрат на сопровождение, написать несколько простых регулярок. Добавив цикл по полям строчки, у тебя будет фиксированное число итераций + пара элементарных замен s//. В то время как метровый регэксп может шариться по этой же строчке достаточно долго. И вероятность ошибок в солжных регэкспах велика, не говоря уже о внесении в них изменений Сплит - плохая идея. Тормозит процесс. Думаю может найти m/ нужный кусок. Отдельно его обработать, а потом заменить просто. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2013, 09:47 |
|
||
|
Переменные в регулярных выражениях. Perl
|
|||
|---|---|---|---|
|
#18+
Testor1, Как сделать замену в зависимости от найденного значения? Если встретиться слово кошка, то заменить это слово на черная, если встретиться слово собака, то заменит это слово на белая s/(кошка|собака)/????/g ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2013, 14:12 |
|
||
|
Переменные в регулярных выражениях. Perl
|
|||
|---|---|---|---|
|
#18+
Testor1, авторСплит - плохая идея. Тормозит процесс. Думаю может найти m/ нужный кусок. Отдельно его обработать, а потом заменить просто. авторКак сделать замену в зависимости от найденного значения? Если встретиться слово кошка, то заменить это слово на черная, если встретиться слово собака, то заменит это слово на белая Т.е. по твоему вторая идея хорошая? _)) Тогда я пас _) Если серьезно split наврядли будет занимает какое то ощутимое время. Тебе нужно переписать over100.000.000 строк - те полностью перезаписать файл, имхо основное время уйдет на ввод/вывод, а не на разбор строк... Ради эксперимента сделай построчное чтение /запись и тоже самое со сплитом и парой замен s// ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2013, 16:04 |
|
||
|
Переменные в регулярных выражениях. Perl
|
|||
|---|---|---|---|
|
#18+
S_Andrey_ATestor1, авторСплит - плохая идея. Тормозит процесс. Думаю может найти m/ нужный кусок. Отдельно его обработать, а потом заменить просто. авторКак сделать замену в зависимости от найденного значения? Если встретиться слово кошка, то заменить это слово на черная, если встретиться слово собака, то заменит это слово на белая Т.е. по твоему вторая идея хорошая? _)) Тогда я пас _) Если серьезно split наврядли будет занимает какое то ощутимое время. Тебе нужно переписать over100.000.000 строк - те полностью перезаписать файл, имхо основное время уйдет на ввод/вывод, а не на разбор строк... Ради эксперимента сделай построчное чтение /запись и тоже самое со сплитом и парой замен s// Так и сделал. 9 ГБ файл. без сплита работал 24 минуты. А в случае сплита 42 минуты. Поясню почему сплит будет медленее. Ведь при разбивке строки на массив нужно динамическое выделения памяти для каждой создаваемой подстроки. Это время и ресурсы, но больше время. Если в строке более 500 столбцов, то это уже сказывается на производительности. Прощу регулярному выражению найти нужную подстроку по шаблону и в ней сделать подмену. Ты сможешь помочь с моим вопросом по поводу замены с условием ? (пример про кошку и собаку) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2013, 16:34 |
|
||
|
Переменные в регулярных выражениях. Perl
|
|||
|---|---|---|---|
|
#18+
Testor1Testor1, Как сделать замену в зависимости от найденного значения? Если встретиться слово кошка, то заменить это слово на черная, если встретиться слово собака, то заменит это слово на белая s/(кошка|собака)/????/g perl -pE ' s/(cat|dog)/if($1 eq "cat"){"black"}elsif($1 eq "dog"){"white"}/e' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2013, 21:50 |
|
||
|
|

start [/forum/topic.php?fid=23&msg=38424626&tid=1463253]: |
0ms |
get settings: |
11ms |
get forum list: |
23ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
71ms |
get tp. blocked users: |
2ms |
| others: | 245ms |
| total: | 418ms |

| 0 / 0 |
