2014-01-19 7 views
0

пытаюсь написать регулярное выражение для вставки пробела в определенном месте. Читаю HTML файл и пытается вставить пробел между #WORD<tag так было бы #WORD <регулярные выражения python в поиске и замене

где WORD является переменной, может быть что угодно, до тех пор, как сво реальное слово (строка)

<p style="text-align: left;" data-redator="true"> #deeds</p><p style="text-align: left;" data-redator="true"></p><p style="text-align: left;" data-redator="true">this is it #$%$%$ dkfj dlkjf dklfj </p> 

в Приведенный выше пример, я хочу, чтобы вставить пробел в #deeds</p> так было бы #deeds </p>

Я пытался использовать строку замены и re.sub, но я не знаю, как заменить при сохранении переменной между ..

любой совет?

обновление

Я попытался прилагаемым в одном из ответов, и она работает хорошо, но проблема в том, что он не будет работать на Юникоде. Я пытался сделать следующую корректировку, она поднимает английские слова, а не символы Юникода, как арабский

re.sub(ur'(#\w+)(<)', ur'\1 \2', c, flags=re.UNICODE) 

Ниже приведен пример HTML

<p style="text-align: left;" data-redator="true"> #$^$%^</p><p style="text-align: left;" data-redator="true"></p><p style="text-align: left;" data-redator="true"> #sdkjf #الكويت</p><p style="text-align: left;" data-redator="true"></p><p style="text-align: left;" data-redator="true"></p> 

какие-либо предложения? Я использовал флаг re.UNICODE и попытался использовать ur перед регулярными выражениями для синтаксического анализа юникода .. но не повезло

+4

Покажите нам, что вы пробовали, не просто опишите это. Мы не можем сказать, что не так с вашим кодом, если нам нужно угадать, что такое ваш код. – abarnert

+1

Между тем, попытка проанализировать HTML с регулярными выражениями, как правило, плохая идея, потому что HTML не является обычным языком. Для быстрых и грязных хаков иногда может быть полезно, но представьте, что вы запускаете свой код на этой странице. Как он будет знать реальные «# дела» из того, что находится внутри вашего примера, не имея контекста и структуры страницы? – abarnert

ответ

3

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

Итак:

r = re.compile(r'#[a-z]+<') 

Это глупая картина, но она будет соответствовать #deeds<, поэтому он служит в качестве примера. Итак, как вы вставляете пространство в нужное место?

Что вам нужно сделать, это захватить его как отдельные группы:

r = re.compile(r'(#[a-z]+)(<)') 

И теперь, вы можете использовать ссылки на эти группы:

r.sub(r'\1 \2', s) 

(в данном случае, так как ваш group 2 - статическая строка, вы можете немного упростить ее - не ставьте < в группу и просто используйте r'\1 <'. Но я думаю, что это более читаемо, и, конечно, более гибкое/надежное, если вы позже расширите то, что y ou're делает, а стоимость исполнения крошечная.)

Документы на Regular Expression Syntax показывают, как создать группу захвата с необязательным именем и как ссылаться на него в re.sub; прокрутите вниз до диаграммы «Контекст ссылки на группу». Также см. re.sub.

1

Там две правильные решения, что я думаю, ваша проблема высокого уровня:

  • Либо вы полностью генерации HTML-страницы самостоятельно, в этом случае вы должны просто использовать шаблонизатор, таких как Мако (http://www.makotemplates.org/), что позволит вам сэкономить массу неприятностей дальше по линии.
  • Или вы пытаетесь изменить HTML-страницу, которую кто-то написал, и в этом случае вы хотите использовать правильный парсер HTML (например, lxml.html - http://lxml.de/lxmlhtml.html), поскольку анализ HTML с регулярными выражениями только когда-либо приводит к боли и страдания.
Смежные вопросы