информационная безопасность
без паники и всерьез
 подробно о проекте
Rambler's Top100Атака на InternetПортрет посетителяSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Tailscale окончательно забанила... 
 Прекращение работы антивируса Касперского... 
 Microsoft Authenticator теряет... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / блог / архив / 2016
АРХИВ
архив
2024
2023
2022
2021
2020
2019
2018
2017
2016
2015
2014
2013
2012
2011
2010
2009
2008
2007
2006
2005
2004
2003
2002
archive





питоннокривое
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 [2209]
назад «  » вперед

аналогичные материалы
qtменюшное // 29.09.23 23:47
студийнораздутое // 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
 
последние записи
ihrkampfное // 02.10.24 16:30
отпускное // 08.07.24 23:02
синхронное // 13.06.24 18:07
автоматизаторское // 16.05.24 18:12
песчаное // 13.03.24 18:05
макоудаленное // 29.01.24 23:10
разнонедельное // 07.12.23 15:09
qtменюшное // 29.09.23 23:47
неестественноинтеллектуальное // 29.09.23 16:50
основательное // 18.09.23 00:15


авто венгрия вырвиглаз германия глюки греция гуглемап драйверы египет железки журнализм империя добра испания италия кино кипр клоуны книги криворучки оспорт португалия программизм сайт софт стрим студень турция уродцы фото франция цацки чехия читалки 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-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach