регулярное выражение в потоке вместо строки?

Предположим, вы хотите выполнять поиск в регулярном выражении и извлекать его по каналу, но шаблон может пересекать несколько строк. Как это сделать? Может быть, библиотека регулярных выражений работает для потока?

Я надеюсь, что эта работа будет использоваться в библиотеке Python? Но любое решение будет в порядке, библиотека, а не инструмент линии cmd, конечно.

Кстати, я знаю, как решить мою текущую проблему, просто ищет общее решение.

Если такой libray не существует, то почему регулярная библиотека не может работать с потоком, учитывая, что обычный алгоритм математики никогда не нуждается в обратном сканировании.

3 Solutions collect form web for “регулярное выражение в потоке вместо строки?”

Если вы после общего решения, ваш алгоритм должен выглядеть примерно так:

  1. Прочтите кусок потока в буфер.
  2. Найти регулярное выражение в буфере
  3. Если шаблон совпадает, сделайте все, что хотите, с совпадением, match.end() начало буфера до match.end() и перейдите к шагу 2.
  4. Если шаблон не соответствует, расширьте буфер с большим количеством данных из потока

Это может закончиться тем, что используется много памяти, если совпадений не найдено, но в общем случае сложно сделать лучше (подумайте о попытке сопоставления .*x как многострочное регулярное выражение в большом файле, где единственным x является последний символ).

Если вы знаете больше о регулярном выражении, у вас могут быть другие случаи, когда вы можете отбросить часть буфера.

Я решил аналогичную проблему для поиска потока, используя классическое сопоставление шаблонов. Вы можете подклассифицировать класс Matcher моего решения streamsearch-py и выполнить сопоставление регулярных выражений в буфере. Ознакомьтесь с приведенным ниже значением kmp_example.py для шаблона. Если окажется, что классический подход Knuth-Morris-Pratt – это все, что вам нужно, тогда ваша проблема будет решена прямо сейчас с помощью этой небольшой библиотеки с открытым исходным кодом 🙂

 #!/usr/bin/env python # Copyright 2014-2015 @gitagon. For alternative licenses contact the author. # # This file is part of streamsearch-py. # streamsearch-py is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # streamsearch-py is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License # along with streamsearch-py. If not, see <http://www.gnu.org/licenses/>. from streamsearch.matcher_kmp import MatcherKMP from streamsearch.buffer_reader import BufferReader class StringReader(): """for providing an example read() from string required by BufferReader""" def __init__(self, string): self.s = string self.i = 0 def read(self, buf, cnt): if self.i >= len(self.s): return -1 r = self.s[self.i] buf[0] = r result = 1 print "read @%s" % self.i, chr(r), "->", result self.i+=1 return result def main(): w = bytearray("abbab") print "pattern of length %i:" % len(w), w s = bytearray("aabbaabbabababbbc") print "text:", s m = MatcherKMP(w) r = StringReader(s) b = BufferReader(r.read, 200) m.find(b) print "found:%s, pos=%s " % (m.found(), m.get_index()) if __name__ == '__main__': main() 

выход

 pattern of length 5: abbab text: aabbaabbabababbbc read @0 a -> 1 read @1 a -> 1 read @2 b -> 1 read @3 b -> 1 read @4 a -> 1 read @5 a -> 1 read @6 b -> 1 read @7 b -> 1 read @8 a -> 1 read @9 b -> 1 found:True, pos=5 

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

Однако, как сказал @James Henstridge, вы можете использовать буферы для преодоления этого.

  • Regex работает неправильно, сопоставляя неожиданные вещи
  • Путаница с использованием регулярных выражений в Python
  • регулярное выражение для шестнадцатеричного
  • Regex найти все предложения текста?
  • повторение нескольких символов regex
  • Python Regular Expression Match Все 5 цифр, но не больше
  • сопоставление всех символов в любом порядке в регулярном выражении
  • Как я могу перевести следующее имя файла в регулярное выражение в Python?
  • Python - лучший язык программирования в мире.