Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
898
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
950
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
940
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1725
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6087
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4398
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Python регулярных выражений для выполнения строки невыход
Я пытаюсь реализовать строку unescaping с Python regex и обратными ссылками, и это, кажется, не хочет работать очень хорошо. Я уверен, что это то, что я делаю неправильно, но я не могу понять, что именно...
>>> import re
>>> mystring = r"This is \n a test \r"
>>> p = re.compile( "\\\\(\\S)" )
>>> p.sub( "\\1", mystring )
'This is n a test r'
>>> p.sub( "\\\\\\1", mystring )
'This is \\n a test \\r'
>>> p.sub( "\\\\1", mystring )
'This is \\1 a test \\1'
Я хотел бы заменить \\[char] на \[char], но обратные ссылки в Python, похоже, не следуют тем же правилам, что и в любой другой реализации, которую я когда-либо использовал. Может кто-нибудь пролить свет?
Ну, я думаю, что вы, возможно, пропустили r или неправильно подсчитали обратные косые черты...
"\\n" == r"\n"
>>> import re
>>> mystring = r"This is \\n a test \\r"
>>> p = re.compile( r"[\\][\\](.)" )
>>> print p.sub( r"\\\1", mystring )
This is \n a test \r
>>>
Что, если я правильно понял, и было запрошено.
Я подозреваю, что более распространенная просьба заключается в следующем:
>>> d = {'n':'\n', 'r':'\r', 'f':'\f'}
>>> p = re.compile(r"[\\]([nrfv])")
>>> print p.sub(lambda mo: d[mo.group(1)], mystring)
This is \
a test \
>>>
Заинтересованный студент должен также прочитать размышления Кена Томпсона о доверии доверию", где наш герой использует аналогичный пример, чтобы объяснить опасности доверия компиляторам, которые вы не загрузили из машинного кода самостоятельно.
Идея заключается в том, что я буду читать в экранированной строке и распаковывать ее (функция, которая заметно отсутствует в Python, для которой вам не нужно прибегать к регулярным выражениям в первую очередь). К сожалению, меня не обманывают обратные косые черты...
Еще один наглядный пример:
>>> mystring = r"This is \n ridiculous"
>>> print mystring
This is \n ridiculous
>>> p = re.compile( r"\\(\S)" )
>>> print p.sub( 'bloody', mystring )
This is bloody ridiculous
>>> print p.sub( r'\1', mystring )
This is n ridiculous
>>> print p.sub( r'\\1', mystring )
This is \1 ridiculous
>>> print p.sub( r'\\\1', mystring )
This is \n ridiculous
То, что я хотел бы напечатать, это
This is
ridiculous
Вас обманывает представление Python результирующей строки. Выражение Python:
'This is \\n a test \\r'
представляет строку
This is \n a test \r
а я думаю, именно этого ты и хотел. Попробуйте добавить 'print' перед каждым из ваших вызовов p.sub(), чтобы напечатать фактическую строку, возвращенную вместо Python представления строки.
>>> mystring = r"This is \n a test \r"
>>> mystring
'This is \\n a test \\r'
>>> print mystring
This is \n a test \r
Марк; его второй пример требует, чтобы каждый экранированный символ был изначально брошен в массив, который генерирует KeyError, если экранирующая последовательность не находится в массиве. Он умрет на чем угодно, кроме трех предоставленных символов (дайте \v попробовать), и перечисление всех возможных escape-последовательностей каждый раз, когда вы хотите распаковать строку (или сохранить глобальный массив), является действительно плохим решением. Аналогично PHP, это использование preg_replace_callback() с lambda вместо preg_replace(), что совершенно не нужно в данной ситуации.
Мне жаль, если я говорю об этом как придурок, я просто совершенно разочарован Python. Это поддерживается всеми другими движками регулярных выражений, которые я когда-либо использовал, и я не могу понять, почему это не работает.
Спасибо за ответ; функция string.decode('string-escape') -это именно то, что я искал изначально. Если у кого-то есть общее решение проблемы regex backreference, не стесняйтесь опубликовать его, и я также приму это в качестве ответа.