Содержимое регулярного выражения Ruby между двумя тегами [duplicate]

Используйте subprocess.Popen() с параметром close_fds=True, который позволит отбросить подпроцесс от самого процесса Python и продолжить работу даже после выхода Python.

https: // gist.github.com/yinjimmy/d6ad0742d03d54518e9f

import os, time, sys, subprocess

if len(sys.argv) == 2:
    time.sleep(5)
    print 'track end'
    if sys.platform == 'darwin':
        subprocess.Popen(['say', 'hello'])
else:
    print 'main begin'
    subprocess.Popen(['python', os.path.realpath(__file__), '0'], close_fds=True)
    print 'main end'

2
задан Charles 19 November 2012 в 06:17
поделиться

2 ответа

Я считаю, что вы ищете не-жадное регулярное выражение, например:

/<div class="the_class">(.*?)<\/div>/m

Обратите внимание на добавленный ?. Теперь захватная группа будет захватывать как можно меньше (не жадные), а не как можно больше (жадные).

7
ответ дан nickb 18 August 2018 в 10:55
поделиться

Поскольку он добавляет другую зависимость и замедляет мою работу. Делает вещи более сложными. Кроме того, это решение применимо не только к HTML-тегам. Мои начальные и конечные строки могут быть любыми.

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

Да, регулярное выражение полезно и полезно, но вас ждут драконы. Например, эта общая строка вызовет проблемы:

'<div class="the_class"><div class="inner_div">foo</div></div>'

Regex /<div class="the_class">(.*?)<\/div>/m вернется:

"<div class=\"the_class\"><div class=\"inner_div\">foo</div>"

Этот искаженный, но визуализируемый HTML:

<div class="the_class"><div class="inner_div">foo

еще хуже:

'<div class="the_class"><div class="inner_div">foo'[/<div class="the_class">(.*?)<\/div>/m]
=> nil

Принимая во внимание, что парсер может иметь дело с обоими:

require 'nokogiri'
[
  '<div class="the_class"><div class="inner_div">foo</div></div>',
  '<div class="the_class"><div class="inner_div">foo'
].each do |html|
  doc = Nokogiri.HTML(html)
  puts doc.at('div.the_class').text
end

Выходы:

foo
foo

Да, ваши начальные и конечные строки могут быть любыми, но есть хорошо известные инструменты для анализа HTML / XML, и по мере роста вашей задачи недостатки в использовании регулярного выражения станут более очевидными.

И, да, возможно, сбой анализатора. Я должен был обработать RSS-каналы, которые были так сильно искажены, что парсер взорвался, но небольшая предварительная обработка устранила проблему.

0
ответ дан the Tin Man 18 August 2018 в 10:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: