2010-09-18 1 views
2

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

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

 
[section] 
regex1 
regex2 

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

ответ

4

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

*section* 

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

(Другой * есть только удовлетворить мою одержимость для симметрии.)

+0

Отличное решение. '*' лучше, так как я могу просто '.strip ('*')' it away вместо того, чтобы добавить хотя бы немного более сложную'.strip ('[]') ' – Falmarri

+3

Пожалуйста, не составляйте свой собственный странный небольшой формат конфигурации с таким странным дизайном, как« использует * в начале строки, чтобы отличить от регулярных выражений ». Используйте XML или JSON или Lua; не засоряйте мир еще одним ненужным форматом пользовательских файлов. –

+0

Поэтому я должен использовать неловкий формат xml, когда то, что я пытаюсь сделать, может быть сделано с помощью простой строки – Falmarri

0

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

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

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

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

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

1

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

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

+0

Я думал об использовании ConfigParser, кроме моих опций, это ключевые пары значений. И хотя я мог бы обойти это, мне нужно сохранить порядок опций в разделе. Я понимаю, что есть решения python3.0, используя order_dict, но мне нужно, чтобы он работал под 2.6.5. И это не так сложно, что стоит использовать пользовательские или фьючерсные модули, когда я могу просто написать его сам. – Falmarri

0

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

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