простой способ определить, может ли строка не быть допустимым регулярным выражением - PullRequest
2 голосов
/ 19 сентября 2010

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

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

[section]
regex1
regex2

Но я только что понял, что [section] является допустимым регулярным выражением. Поэтому мне интересно, есть ли способ отформатировать заголовок раздела, чтобы его можно было ТОЛЬКО понимать как заголовок раздела, а не как регулярное выражение.

Ответы [ 4 ]

4 голосов
/ 19 сентября 2010

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

*section*

Вы не можете иметь квантификатор (*) в начале регулярного выражения.

(Другой * просто для того, чтобы удовлетворить мою одержимость симметрией.)

1 голос
/ 19 сентября 2010

Я не знаю вашу проблемную область, поэтому я не знаю, какие формы регулярных выражений вы ожидаете, но мне кажется, вы должны сохранить форматирование своего раздела таким, какое оно есть. Регулярное выражение, начинающееся с [и заканчивающееся на] и не имеющее между собой квадратных скобок, довольно необычно. Он может соответствовать только одному символу. Поэтому оставьте заголовки разделов такими, какие они есть. Строго говоря, они являются действительными регулярными выражениями, но, вероятно, они не являются интересными регулярными выражениями.

Кроме того, почему бы не использовать ConfigParser из стандартной библиотеки и позволить ей выполнить анализ для вас?

0 голосов
/ 20 сентября 2010

Как уже говорили другие, не придумывайте еще один формат конфигурации.Используйте стандартную библиотеку Python ConfigParser , которая сможет анализировать нотацию [section] точно так, как вы ее показали.

EDIT: опция allow_no_value позволяет вам иметь только одинзапись, а не пара ключ / значение.И типом диктовки по умолчанию является OrderedDict, поэтому он будет поддерживать порядок.

0 голосов
/ 19 сентября 2010

Есть простые способы, но все они требуют изменения вашего формата:

  1. Используйте отступы, аналогично интерпретации исходного кода Python.Для начальных пробелов требуется специальная обработка, например «(?:) Abc» вместо «abc».
  2. Используйте формат INI, где для каждого элемента в разделе требуется пара имя = значение.
  3. Использовать какой-то синтаксис списка. ast.literal_eval будет полезен.

    section1 = [
      "regex 1",
      "2",
      "3",
    ]
    section2 = ["..."]
    

Прежде всего, не изобретайте свой собственный формат или не приближайте его кизвестный формат, как вы можете.Третий - это подмножество синтаксиса Python, например, и вы можете даже использовать необработанные строковые литералы естественным образом.

JSON или YAML могут быть вам полезны.

...