2012-05-27 23 views
2

所以我有一個yaml文件,我將其用作配置文件。我試圖做一些字符串與正則表達式匹配,但我無法解釋從yaml到Python的正則表達式。有問題的正則表達式如下:Python從yaml配置文件解釋正則表達式

regex: 
    - [A-Za-z0-9] 

當我嘗試使用re.match功能,我得到這個錯誤:

Traceback (most recent call last): 
    File "./dirpylint.py", line 132, in <module> 
    sys.exit(main()) 
    File "./dirpylint.py", line 32, in main 
    LevelScan(level) 
    File "./dirpylint.py", line 50, in LevelScan 
    regex_match(level) 
    File "./dirpylint.py", line 65, in regex_match 
    if re.match(expression, item) == None: 
    File "/usr/lib/python2.7/re.py", line 137, in match 
    return _compile(pattern, flags).match(string) 
    File "/usr/lib/python2.7/re.py", line 229, in _compile 
    p = _cache.get(cachekey) 
TypeError: unhashable type: 'list' 

我的理解,它的解釋正則表達式作爲一個列表,但如何使用yaml文件中定義的正則表達式來搜索字符串?

回答

1

問題是YAML,而不是Python。如果要將包含文字方括號的字符串值存儲在YAML文件中,則必須引用該值。

regex: 
- "[A-Za-z0-9]" 

此外,請注意,在這個YAML的regex的值是包含一個字符串,而不是一個簡單的字符串列表

3

您在YAML文件中使用了兩個列表結構。當加載YAML文件:

>>> d = yaml.load(open('config.yaml')) 

你得到這樣的:

>>> d 
{'regex': [['A-Za-z0-9']]} 

注意,方括號中的正則表達式實際上消失,因爲他們被認爲是列表分隔符。你可以引述他們:

正則表達式: - 「[A-ZA-Z0-9]」

爲了得到這個:

>>> yaml.load(open('config.yaml')) 
{'regex': ['[A-Za-z0-9]']} 

因此正則表達式是d['regex'][0]。但你也可能只是這樣做在你的yaml文件:

regex: "[A-Za-z0-9]" 

它可以幫助您:

>>> d['regex'] 
'[A-Za-z0-9]' 

>>> d = yaml.load(open('config.yaml')) 
>>> d 
{'regex': '[A-Za-z0-9]'} 

因此正則表達式可以用類似的字典查找檢索......這可以說非常簡單。

1

我在我的YAML解析「引擎」中做了這個。

In [1]: from StringIO import StringIO 
In [2]: import re, yaml 
In [3]: yaml.add_constructor('!regexp', lambda l, n: re.compile(l.construct_scalar(n))) 
In [4]: yaml.load(StringIO("pattern: !regexp '^(Yes|No)$'")) 
Out[4]: {'pattern': re.compile(ur'^(Yes|No)$')} 

而且這個工作,如果你想使用safe_load和!!蟒蛇/正則表達式(類似於Ruby的和的NodeJS'實現):

In [5]: yaml.SafeLoader.add_constructor(u'tag:yaml.org,2002:python/regexp', lambda l, n: re.compile(l.construct_scalar(n))) 
In [6]: yaml.safe_load(StringIO("pattern: !!python/regexp '^(Yes|No)$'")) 
Out[6]: {'pattern': re.compile(ur'^(Yes|No)$')}