информационная безопасность
без паники и всерьез
 подробно о проекте
Rambler's Top100За кого нас держат?Все любят медГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Шестой Perl превратится в Raku,... 
 Kik закрывается, все ушли на криптофронт 
 Sophos открывает Sandboxie 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / блог / архив / 2016
АРХИВ
архив
2019
2018
2017
2016
2015
2014
2013
2012
2011
2010
2009
2008
2007
2006
2005
2004
2003
2002
archive




The Bat!

питоннокривое
12.03.16 19:00 // оригинал
Чтобы набить руку, перетащил вспомогательные скрипты рабочего проекта с перла на питон. В процессе местами порадовался, местами исплевался. Некоторые вещи сперва привели в полное недоумение, окончательно с ними разобрался, пока писал этот поначалу еще более гневный пост, но даже после прояснения причины они оставили ощущение крайней неудовлетворенности и полной кривизны.

Ну ладно, я смирился с тем, что raw strings не помогают в случае последнего '\' в строке (да, действительно, в такой строке может встретиться внутренний ', который нужно эскейпить, и различить две ситуации с \' невозможно). Смирился и с тем, что в подобной ситуации в случае регекспа один заменяемый слеш приходится изображать четырьмя. Но полной неожиданностью стало то, что та же фигня творится и со строкой замены, т.е. со вторым параметром sub.

Т.е. вполне ожидаемо, что print (re.sub('a', '\n', 'a a a')) превратит три "а" в три перевода строки. Менее очевидно, но то же самое происходит при print (re.sub('a', r'\n', 'a a a')). По той же логике print (re.sub('a', '\\', 'a a a')) выдает ошибку и приходится использовать print (re.sub('a', '\\\\', 'a a a')). Похоже, что это сделали ради обработки всяких \1, из-за которых и строку замены стали обрабатывать аналогично шаблонной, другого объяснения я найти не могу.

Что гораздо более неприятно, та же ерунда происходит, если эти слеши пришли в переменной, которая может использоваться и в других местах, где лишний слеш совсем ни к чему (какая-нибудь path = r'path\to\file', которая той же print выводится as is). И это уже заметно ломает поведение при переносе кода с перла - получается, что перед отправкой в регексп такую переменную нужно дополнительно обрабатывать. Причем re.escape тут, к сожалению, не помогает, поскольку портит другие символы. Небольшим утешением стало то, что подсовывание функции/лямбды ситуацию вроде бы лечит: print (re.sub('a', lambda m: '\\', 'a a a')), хоть возвращает она в точности ту же строку.

Полный демонстрационный код, закомментированы неработающие строчки:

---------------------
import re

a = 'a a a'
sl = '\\'
n = r'\n'

print (sl, n)

print (1, re.sub('a', r'\n', a))
print (2, re.sub('a', '\n', a))
print (3, re.sub('a', n, a))
print (4, re.sub('a', lambda m: r'\n', a))
print (5, re.sub('a', lambda m: n, a))

print (6, re.sub('a', '\\\\', a))
print (7, re.sub('a', lambda m: '\\', a))
print (8, re.sub('a', lambda m: sl, a))

# print (re.sub('a', '\\', a))
# print (re.sub('a', sl, a))
---------------------
Аналогичный код на перле выдает вполне предсказуемый результат:
$a = 'a a a';
$n = '\n';
$a =~ s/a/$n/g;
print $a;

   
теги: программизм  |  обсудить  |  все отзывы (0)  |  обсудить в LJ [1142]
назад «  » вперед

аналогичные материалы
студийнораздутое // 08.03.17 02:24
плюсовое // 05.04.16 21:21
плюсношаблонное // 14.08.14 22:50
бустовское // 28.01.14 20:32
студийное // 28.10.13 20:00
ATLное // 07.04.13 19:08
стингрейное // 06.04.13 19:22
лентоньюшное // 21.01.13 19:27
дисковое // 10.11.12 22:21
регекспное // 23.05.12 18:08
 
последние записи
мтснороуминговое // 11.09.19 12:35
бунтороботное // 11.07.19 22:17
асусноапгрейдное // 23.06.19 22:29
айпаднофлешное // 17.06.19 21:39
отпускное // 09.06.19 22:12
берлинскоавтобусное // 29.05.19 19:57
онлайноголосовальное // 29.05.19 14:35
геймофтронное // 18.05.19 17:54
бироуминговое // 15.05.19 19:02
регистрационнонервное // 08.05.19 00:41


авто венгрия вырвиглаз германия глюки греция гуглемап драйверы египет железки журнализм империя добра испания италия кино кипр клоуны книги криворучки оспорт португалия программизм сайт софт стрим студень турция уродцы фото франция цацки чехия читалки android bq e51 eeepc from facebook hd2 hpc htc ipad iphone onlime vista windows 10 windows 7 windows 8 yota



Rambler's Top100
Рейтинг@Mail.ru



  Copyright © 2001-2019 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach