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

И вот форма метода запроса.

List<Line> parentLineList =
  content.ChildControls.OfType<TabSections>()
    .SelectMany(t => t.ChildControls.OfType<Paragraph>())
    .SelectMany(p => p.ChildControls.OfType<Line>())
    .ToList();
17
задан Alan Moore 26 January 2016 в 02:06
поделиться

5 ответов

Вы не можете сделать это обычно, используя регулярные выражения Python. (Регулярные выражения .NET были расширены с помощью «балансирующих групп», что позволяет использовать вложенные совпадения.)

Однако PyParsing - очень хороший пакет для этого типа вещей:

from pyparsing import nestedExpr

data = "( (a ( ( c ) b ) ) ( d ) e )"
print nestedExpr().parseString(data).asList()

Результат:

[[['a', [['c'], 'b']], ['d'], 'e']]

Подробнее о PyParsing:

19
ответ дан 30 November 2019 в 10:22
поделиться

Регулярные выражения не могут анализировать вложенные структуры. Вложенные структуры по определению не являются регулярными. Они не могут быть построены с помощью регулярной грамматики, и они не могут быть проанализированы с помощью конечного автомата (регулярное выражение можно рассматривать как сокращенную запись для FSA).

Сегодняшние механизмы «регулярных выражений» иногда поддерживают некоторую ограниченную «вложенность» конструкции, но с технической точки зрения их больше нельзя называть "обычными".

21
ответ дан 30 November 2019 в 10:22
поделиться

Python не поддерживает рекурсию в регулярных выражениях. Таким образом, эквиваленты групп балансировки .NET или регулярного выражения PCRE в Perl не сразу возможны в Python.

Как вы сами сказали: это НЕ проблема, которую вы действительно должны решать с помощью одного регулярного выражения.

2
ответ дан 30 November 2019 в 10:22
поделиться

Вы говорите о рекурсии? Это не ясно из вашего вопроса. Пример:

ActivePython 2.6.1.1 (ActiveState Software Inc.) based on
Python 2.6.1 (r261:67515, Dec  5 2008, 13:58:38) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> p = re.compile(r"((\w+((\d+)[.;]))(\s+)\d)")
>>> m = p.match("Fred99. \t9")
>>> m
<_sre.SRE_Match object at 0x00454F80>
>>> m.groups()
('Fred99. \t9', 'Fred99.', '9.', '9', ' \t')

Показывает соответствие вложенных групп. Нумерация групп зависит от порядка, в котором их открывающие скобки встречаются в шаблоне.

0
ответ дан 30 November 2019 в 10:22
поделиться

Я бы порекомендовал удалить вложенность из самого регулярного выражения, перебирать результаты и выполнять с ними регулярные выражения.

1
ответ дан 30 November 2019 в 10:22
поделиться
Другие вопросы по тегам:

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