простую рекурсивную строку заменить в python? - PullRequest
0 голосов
/ 26 ноября 2011

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

astring="<li><a href="#Quick Start">Quick Start*</li></li>
<li><a href="#Parsing a Document">Parsing a Document*</li></li>
<ul>
<li><a href="#Parsing HTML">Parsing HTML*</li></li>
<li><a href="#Parsing XML">Parsing XML*</li></li>"

tweaked = re.sub(r"\*",r"</a>", astring)

Я думал, что r означает рекурсив, но, похоже, здесь это не делается. Это действительно трудно для простой замены?

Я пробовал string.replace - что не сработало, я думаю, что это новые строки? Затем я попытался string.translate, в котором требовалось такое же количество символов в строке замены, которое не работало в этом примере и содержало слишком много строк кода. Я пробовал множество версий этого, что я делаю не так?

Может быть, я неправильно понимаю рекурсивный? Я думал, что это означало «не один матч, продолжай до конца»? Я хочу заменить * with the </a>. часть astring является просто примером, а не фактической строкой, которую я пытаюсь заменить, поскольку она огромна. (прошу также извинить меня за новизну)

ПОЖАЛУЙСТА, ГОЛОСОВАТЬ НАСТОЯЩИМ ВОПРОСОМ, ЧТОБЫ УБИТЬСЯ

Ответы [ 3 ]

2 голосов
/ 26 ноября 2011

Следует отметить несколько вещей:

  1. Строка не является допустимым синтаксисом Python.Он определяется одинарными двойными кавычками, но в нем есть двойные кавычки.Определите строку с одинарными кавычками str = 'blah blah' или используйте тройные кавычки str = """blah blah"""

  2. str - это имя встроенной функции .Рекомендуется не переопределять встроенные модули (хотя это разрешено).

  3. r"" определяет «необработанную строку».См. docs .

  4. re.sub() заменяет все непересекающиеся совпадающие последовательности в строке, что вам и нужно.В простых случаях предпочтительным является string.replace(), например mystring.replace('*', '</a>').См. документы .

С учетом этих точек этот код:

import re

mystring = '''<li><a href="#Quick Start">Quick Start*</li></li>
<li><a href="#Parsing a Document">Parsing a Document*</li></li>
<ul>
<li><a href="#Parsing HTML">Parsing HTML*</li></li>
<li><a href="#Parsing XML">Parsing XML*</li></li>'''

mynewstring = re.sub(r'\*', '</a>', mystring)
print(mynewstring)

будет выдавать следующий вывод:

<li><a href="#Quick Start">Quick Start</a></li></li>
<li><a href="#Parsing a Document">Parsing a Document</a></li></li>
<ul>
<li><a href="#Parsing HTML">Parsing HTML</a></li></li>
<li><a href="#Parsing XML">Parsing XML</a></li></li>

Обратите внимание, что косая черта в строке замены </a> делает не экранированием.Однако для шаблона '*' требуется , чтобы сделать его действительным регулярным выражением.

1 голос
/ 26 ноября 2011

В Python r'' и r"" обозначают необработанные строки. Внутри необработанной строки интерпретация обратной косой черты не выполняется.

Кажется, что следующее работает очень хорошо:

foo="""<li><a href="#Quick Start">Quick Start*</li></li>
<li><a href="#Parsing a Document">Parsing a Document*</li></li>
<ul>
<li><a href="#Parsing HTML">Parsing HTML*</li></li>
<li><a href="#Parsing XML">Parsing XML*</li></li>"""

foo = foo.replace('*', '</a>')
1 голос
/ 26 ноября 2011

Принимая во внимание предложения в комментариях, вот возможное решение:

string = """<li><a href="#Quick Start">Quick Start*</li></li>
<li><a href="#Parsing a Document">Parsing a Document*</li></li>
<ul>
<li><a href="#Parsing HTML">Parsing HTML*</li></li>
<li><a href="#Parsing XML">Parsing XML*</li></li>"""

string = string.replace("*", "</a>")
print string
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...