Регулярные выражения , как концепция, являются методом компактного и эффективного представления и рассуждения о конечных штатных машинах всех видов. Они иногда используются неправильно, и когда они, они затрудняют рассуждать код, а не проще-когда это возможно, обычно лучше учитывать семантически средние управляющие переменные и/или кодировать состояние в поток управления программой-но вспомогательные. Вездесущий инструмент в наборе инструментов программиста по причине. Можно написать взломы, которые проецируют последовательность событий на текстовую строку и использовать инструменты Text-Regex для ее обработки, но она всегда уродливо:
Код: Выделить всё
a = Pin("GPIO1", mode=Pin.IN)
b = Pin("GPIO2", mode=Pin.IN)
x = Pin("GPIO3", mode=Pin.OUT)
y = Pin("GPIO4", mode=Pin.OUT)
inputs = { id(p): s for p,s in [
a: "a",
b: "b",
]}
outputs = [(p, re.compile(s)) for p,s in [
(x, r".*A(a.*){3,}"),
(y, r".*(A[^a]*?B|B[^b]*?A)[^ab]*"),
]]
history = io.StringIO()
def isr(pin):
name = inputs[id(pin)]
if pin.value():
name = name.upper()
history.write(name)
for out, out_re in regexes:
out.value(bool(out_re.fullmatch(history)))
a.irq(isr, trigger=RISING|FALLING)
b.irq(isr, trigger=RISING|FALLING)
< /code>
(конечно, вы никогда бы не использовали это для подсчета трех импульсов или выполнения логического /p>
Помимо других проблем, этот подход: < /p>
Требуется произвольно растущий буфер памяти, чтобы добавить, < /li>
не имеет верхней границы задержки (совершенно неуместно для IRQ), < /li>
Может потребовать выделения новой памяти (часто даже невозможно безопасно делать в IRQ), < /li>
и требует какой -то Kludge, чтобы определить текстовые кодирования для каждого события. Вы пытаетесь реализовать такие вещи, как помеченные состояния или асинхронные переходы задержки. Есть дальнейшие взломы, массируя именно то, как вы создаете текстовую строку, представляющую историю системы, но они ужасны в обоих смыслах слова.
[b] Какие методы или существующие библиотеки существуют, которые выполняют < /em> этот тип не текстового приложения для регулярных выражений? < /Strong> < /p>
Внутренне регулярные выражения обычно собираются в какую -то состояние состояния, чтобы эффективно оценить их. Нет теоретической причины, по которой та же самая скомпилированная государственная машина внутри, например объект re.pattern
К сожалению,, Большинство библиотек регулярного выражения сохраняют свои государственные машины в качестве внутренней детали реализации и не предоставляют никаких видов API для интерактивного доступа; И учитывая требования к производительности для обработки текста, в Python вы не можете просто коснуться нескольких «частных» подчеркивающих участников, это то, что вам нужно для доступа к его базовой структуре через CPI C для. < /p>
Как я могу составить регулярное выражение в объект интерактивного состояния машины, а не просто черный ящик? M в первую очередь заинтересована либо Pure Python, либо C -кодом C, для которого я мог бы легко написать привязку к микропитону. Библиотеки в других средах по -прежнему были бы полезны, чтобы узнать, хотя - если мне нужно реализовать это сам, это все равно будет хорошим источником для понимания или дизайнерских решений, которые стоит заимствовать. < /P>
На данный момент, я ожидаю Правописание, напоминающее резервные аппараты текста в стиле Perl). Абсолютное чувство защиты от атак на боковых каналах), я склоняюсь к алгоритму Макнотона -Юмада -Томпсон для оценки регуляции как нетерминированного конечного автомата, с активациями состояния, закодированными как вектор. Если требуемые закрытия Epsilon все полностью предварительно вычисляются, любой переход может быть полностью оценен с помощью фиксированного числа бичевых операций (то есть это просто матрица GF (2), умножаясь с использованием соответствующей матрицы перехода). < /P>
< P> Этот подход, по -видимому, имеет преимущество в том, как каждое бит штата имеет четкую связь с конкретным индексом регулярного выражения. При этом можно представить, что добавление возможности пометить их в регулярном выражении (то есть, аналогично духу, чтобы пометить выходы «захват группы», создаваемые библиотеками текста-реки), и получить дополнительное семантическое использование от одного выражения. .
Это также ограничено подходом, поскольку представление состояния NFA довольно скудно-ему нужны биты o (n) хранения для n-длины. Процесс распределения ресурсов таймера для переходов задержки времени в этом представлении не был бы особенно простым, и не разрешал конфликтующие задержки, когда при составлении NFA с его установленной DFA и выполнением его. /> Есть и другие алгоритмы, которые тоже существуют, например, Ахо-сити-ульман; Деривативы Брзозовски. Но их трудно оценить за их практические компромиссы здесь, не инвестируя инженерные усилия в фактическое реализацию их всех. Большинство описаний-это либо произведения типа «Теория вычисления», которые пренебрегают прагматическими деталями, либо фокусируются на приложении обработки текста таким образом, что делает их выводы бесполезными. Алгоритмы должны рассмотреть здесь для оценки не текстовых регулярных выражений? Какие соображения мне следует изучить на выбор этих алгоритмов? [/b]
Подробнее здесь: https://stackoverflow.com/questions/794 ... hine-logic