Python: \ число обратных ссылок в re.sub - PullRequest
1 голос
/ 30 июля 2009

Я пытаюсь использовать функцию py.sub re.sub для замены текста.

>>> import re
>>> text = "<hi type=\"italic\"> the></hi>"
>>> pat_error = re.compile(">(\s*\w*)*>")
>>> pat_error.search(text)
<_sre.SRE_Match object at 0xb7a3fea0>
>>> re.sub(pat_error, ">\1", text)
'<hi type="italic">\x01</hi>'

После этого значение текста должно быть

"<hi type="italic"> the</hi>"

Ответы [ 2 ]

9 голосов
/ 30 июля 2009

Две ошибки в вашем коде. Во-первых, вы не соответствуете (и, в частности, захватываете) то, что, по вашему мнению, соответствует и захватываете - вставьте после вашего звонка .search:

>>> _.groups()
('',)

Неограниченное повторение (звезда после захвата группы, в которой только звезды) совпадает слишком много - с пустой строкой в ​​конце того, что вы считаете совпадающим - и это то, что захватывается. Исправьте, изменив хотя бы одну из звезд на плюс, например, на:

>>> pat_error = re.compile(r">(\s*\w+)*>")
>>> pat_error.search(text)
<_sre.SRE_Match object at 0x83ba0>
>>> _.groups()
(' the',)

Теперь ЭТО сопоставляет и фиксирует разумно. Во-вторых, вы не используете синтаксис необработанных строковых литералов там, где должны, поэтому у вас нет обратной косой черты там, где вы думаете, что она есть - у вас есть escape-последовательность \1, которая совпадает с chr (1). Исправить, используя синтаксис необработанных строковых литералов, то есть после приведенного выше фрагмента

>>> pat_error.sub(r">\1", text)
'<hi type="italic"> the</hi>'

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

0 голосов
/ 30 июля 2009
>>> text.replace("><", "<")
'<hi type="italic"> the</hi>'
...