所以我有一个yaml文件,我正在使用它作为配置文件。我正在尝试与正则表达式进行一些字符串匹配,但是我无法将正则表达式从yaml解释为python。有问题的正则表达式如下所示:
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文件中定义的正则表达式来搜索字符串?
答案 0 :(得分: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 = yaml.load(open('config.yaml'))
>>> d
{'regex': '[A-Za-z0-9]'}
因此可以使用类似的字典查找检索正则表达式:
>>> d['regex']
'[A-Za-z0-9]'
......这可以说简单得多。
答案 1 :(得分:3)
我在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和!! python / regexp(类似于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)$')}
答案 2 :(得分:2)
问题是YAML,而不是Python。如果要在YAML文件中存储包含文字方括号的字符串值,则必须引用它。
regex:
- "[A-Za-z0-9]"
另请注意,在此YAML中,regex
的值是包含一个字符串的列表,而不是简单的字符串。