Я пытался узнать о регулярных выражениях для проекта, в котором я хочу создать текстовую грамматику , регулярные выражения кажутся относительно простыми, но очень сложными для чтения для меня, поэтому я попытался создать утилиту модуль Python , который может генерировать их, он работает как задумано и генерирует регулярные выражения, которые на самом деле работают, с псевдонимами, понятными для имен.
например:
struc_enum = OrGroup("struct", "enum")
whitespace = TAB_SPACE.at_least(1)
в результате:
(?:struct|enum)
[ \t]+
в этом случае использование псевдонимов Python не дает больших преимуществ, но тогда я могу сделать следующее:
valid_name = r"\b" + Group(ALPHA, ALPHANUMERIC.repeated())
struc_enum = OrGroup("struct", "enum")
typed_name = (struc_enum + whitespace).optional() + valid_name + whitespace + valid_name.captured()
и вот что отображает print(typed_name)
:
(?:(?:(?:struct|enum)[ \t]+)?\b[a-zA-Z][a-zA-Z\d]*[ \t]+(\b[a-zA-Z][a-zA-Z\d]*))
Этот метод можно использовать для создания небольших фрагментов и объединения их для создания более сложных шаблонов, но для каждого уровня конкатенации выражение растет экспоненциально большим, таким образом, что я мог легко получить на этом этапе:
(?:(func)[\s]+([a-zA-Z_]+[a-zA-Z\d_]*)[\s]*\([\s]*(?:[a-zA-Z_]+[a-zA-Z\d_]*(?:[\s]*[a-zA-Z_]+[a-zA-Z\d_]*[*]{,2})?(?:[\s]*,[\s]*[a-zA-Z_]+[a-zA-Z\d_]*(?:[\s]*[a-zA-Z_]+[a-zA-Z\d_]*[*]{,2})?)*[\s]*)?\))
В атомарной грамматике это большое приведенное выше регулярное выражение может соответствовать строкам, подобным этой, но, похоже, не работает в других местах:
func myfunc(asd asd*, asd*, asdasd)
func do_foo01(type arg1, int arg2)
С enougПри терпении человек может создать эквивалентное выражение, но, вероятно, намного короче, что поднимает вопрос.Большие регулярные выражения хуже или лучше эквивалентных более коротких в терминах вычислительных затрат?В какой момент мы можем считать регулярные выражения слишком большими?