2010-09-18 30 views
2

我有一個配置文件,用戶可以指定部分,然後在這些部分,他們可以指定正則表達式。我必須解析這個配置文件並將正則表達式分成不同的部分。簡單的方法來確定如果一個字符串不能是一個有效的正則表達式

是否有一種簡單的方法來從節標題中定義正則表達式?我在想只是標準

 
[section] 
regex1 
regex2 

但我只是意識到[部分]是一個有效的正則表達式。所以我想知道是否有一種方法可以格式化節標題,以便它只能被理解爲節標題而不是正則表達式。

回答

4

有進行無效的正則表達式的無限的方式,但想到的第一件事是

*section* 

你不能在正則表達式的開始量詞(*)。

(另*在那裏只是爲了滿足我癡迷的對稱性。)

+0

不錯的簡單解決方案。無論如何''''更好,因爲我可以'.strip('*')'而不必添加儘管稍微複雜一點的'。strip('[]')' – Falmarri 2010-09-19 00:30:21

+3

請不要用自己奇怪的小配置格式來製作這樣一個奇怪的設計,就像「在開始時使用*來區分正則表達式」。使用XML或JSON或Lua;不要讓另一個不必要的自定義文件格式亂拋垃圾。 – 2010-09-19 01:33:18

+0

所以我寧願使用一個尷尬的XML格式,當我想要做的事情可以用一條簡單的線做 – Falmarri 2010-09-19 05:56:17

0

有個簡單的方法,但它們都需要改變你的格式:

  1. 使用縮進,類似Python的源被解釋。領導空間需要特殊處理,例如「(?:)abc」而不是「abc」。
  2. 使用INI格式,其中節中的每個項目都需要一個名稱=值對。
  3. 使用某種列表語法。 ast.literal_eval將會有所幫助。

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

首先,不要發明自己的格式,或使之儘可能接近已知的格式,你可以。第三個是Python語法的一個子集,例如,你甚至可以自然地使用原始字符串文字。

JSON或YAML可能對您有用。

1

我不知道你的問題域,所以我不知道你期待什麼形式的正則表達式,但在我看來,你應該保持你的部分格式。以[開頭並且以]結尾並且沒有方括號的正則表達式非常不尋常。它只能匹配單個字符。因此,請保留節標題。嚴格地說,它們是有效的正則表達式,但它們可能不是有趣的正則表達式。

另外,爲什麼不使用標準庫中的ConfigParser,讓它爲你做解析?

+0

我想過使用ConfigParser,除了我的選項是關鍵值對。雖然我可以解決這個問題,但我需要保留該部分下的選項順序。我意識到有使用ordered_dict的python3.0解決方案,但我需要它在2.6.5下工作。而且,當我自己寫這些模塊時,值得使用定製或未來模塊並不複雜。 – Falmarri 2010-09-19 00:28:23

0

正如其他人所說,請不要發明另一種配置格式。使用Python標準庫的ConfigParser,它將能夠完全按照您所示的方式解析[章節]符號。

編輯:allow_no_value選項允許你只有一個條目,而不是一個鍵/值對。默認的字典類型是OrderedDict,所以它會保持順序。

相關問題