Замена \ n на <br>между указанными тегами с помощью python re.sub () - PullRequest
0 голосов
/ 03 июля 2019

У меня есть несколько разделенных табуляцией фрагментов HTML в файле .tsv. Вот пример одного из фрагментов:

<li> 
  <p>Create a list of letters, <code>lst</code> from the string <code>strng = &quot;abc&quot;</code>.</p> 

  <ul> 
    <li>Use the list constructor, <code>list()</code>, to create a list from a string.</li> 
  </ul> 

  <pre>
      <code class='language-python' lang='python'>
      strng = &quot;abc&quot; 
      lst = list(a) 
      #lst = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;] 
    
  

Я хотел бы заменить символы новой строки \n на разрывы строк, <br>, только между тегами <pre> <code class='language-python' lang='python'> и , используя регулярное выражение и re.sub().

Я попытался создать следующее регулярное выражение для соответствия желаемым переводам строки:

<code>(?<=<pre><code)\r\n?|\n(?<=
)

Однако приведенное выше регулярное выражение не соответствует никаким символам новой строки из фрагмента. Хотя, если я уберу положительный отстающий, то регулярное выражение соответствует соответствию нужным мне строкам (по крайней мере, для фрагмента, который я показал в этом посте, a; хотя это не будет верно для все входы).

(?<=<pre><code)\r\n?|\n

Может ли регулярное выражение, которое будет перехватывать все новые строки между тегами: <pre> <code class='language-python' lang='python'> и во всех возможных фрагментах?

РЕДАКТИРОВАТЬ : Эти фрагменты не используют "полный" HTML. Они на самом деле предназначены для экспорта в приложение флэш-карты mnemosyne . Каждый из этих фрагментов представляет одну карточку, которая всегда будет иметь одинаковую контролируемую структуру html (определено мной). Таким образом, использование регулярных выражений в этом случае не будет иметь никаких последствий. Кроме того, html рендер, используемый mnemosyne, не разрывает строки в тегах <pre>, поэтому я пытаюсь сделать это вручную с помощью <br>.

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Если вы находитесь в ситуации, когда вы можете быть достаточно уверены в своем вводе, чтобы продолжить использование регулярных выражений вместо анализатора HTML, одним из более простых способов может быть замена в два этапа с использованием функции в качестве замены в re.sub * * 1002

def nl2br(text):
    return "<br>".join(text.splitlines())


re.sub("(<pre><code[^>]*>)(.*?)(
) ", лямбда-выражение m: m.group (1) + nl2br (m.group (2)) + m.group (3), html, flags = re.DOTALL)

(может потребоваться \s* между <pre> / <code> и / </pre>.)

1 голос
/ 03 июля 2019

Если все файлы представляют собой только фрагменты HTML, что означает синтаксический анализ XML, лучший способ сделать это - использовать синтаксический анализатор XML:

from xml.dom import minidom
xmlDocument = minidom.parse('file.tsv')
codeItem = xmldoc.getElementsByTagName('code')
codeItem.firstChild.replaceWholeText(codeItem.firstChild.nodeValue.replace('\n', '<br>'))
print xmlDocument.toxml()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...