Python从yaml配置文件中解释正则表达式

问题描述 投票:2回答:3

所以我有一个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文件中定义的正则表达式来搜索字符串?

python regex pyyaml
3个回答
3
投票
中的正则表达式

问题是YAML,而不是Python。如果要在YAML文件中存储包含文字方括号的字符串值,则必须用引号引起来:

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

此外,请注意,在此YAML中,regex的值是包含一个字符串而不是简单字符串的list


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]'

...这可能更简单。


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)$')}
© www.soinside.com 2019 - 2024. All rights reserved.