Сведения о вопросе

Martincow

08:28, 19th August, 2020

Теги

python   regex   backreference    

Python регулярных выражений для выполнения строки невыход

Просмотров: 480   Ответов: 5

Я пытаюсь реализовать строку 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, похоже, не следуют тем же правилам, что и в любой другой реализации, которую я когда-либо использовал. Может кто-нибудь пролить свет?



  Сведения об ответе

ASSembler

04:51, 25th August, 2020

Разве не это делает второй пример Андерса?

В 2.5 есть также кодировка string-escape , которую вы можете применить:

>>> mystring = r"This is \n a test \r"
>>> mystring.decode('string-escape')
'This is \n a test \r'
>>> print mystring.decode('string-escape')
This is 
 a test 
>>> 


  Сведения об ответе

crush

10:04, 21st August, 2020

Ну, я думаю, что вы, возможно, пропустили 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 \
>>>

Заинтересованный студент должен также прочитать размышления Кена Томпсона о доверии доверию", где наш герой использует аналогичный пример, чтобы объяснить опасности доверия компиляторам, которые вы не загрузили из машинного кода самостоятельно.


  Сведения об ответе

SILA

22:35, 4th August, 2020

Идея заключается в том, что я буду читать в экранированной строке и распаковывать ее (функция, которая заметно отсутствует в 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


  Сведения об ответе

lats

02:52, 20th August, 2020

Вас обманывает представление 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


  Сведения об ответе

baggs

18:19, 4th August, 2020

Марк; его второй пример требует, чтобы каждый экранированный символ был изначально брошен в массив, который генерирует KeyError, если экранирующая последовательность не находится в массиве. Он умрет на чем угодно, кроме трех предоставленных символов (дайте \v попробовать), и перечисление всех возможных escape-последовательностей каждый раз, когда вы хотите распаковать строку (или сохранить глобальный массив), является действительно плохим решением. Аналогично PHP, это использование preg_replace_callback() с lambda вместо preg_replace(), что совершенно не нужно в данной ситуации.

Мне жаль, если я говорю об этом как придурок, я просто совершенно разочарован Python. Это поддерживается всеми другими движками регулярных выражений, которые я когда-либо использовал, и я не могу понять, почему это не работает.

Спасибо за ответ; функция string.decode('string-escape') -это именно то, что я искал изначально. Если у кого-то есть общее решение проблемы regex backreference, не стесняйтесь опубликовать его, и я также приму это в качестве ответа.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться