Wil*_*ill 4 python regex pyyaml
所以我有一个 yaml 文件用作配置文件。我正在尝试使用正则表达式进行一些字符串匹配,但在将 yaml 中的正则表达式解释为 python 时遇到问题。有问题的正则表达式如下所示:
regex:
- [A-Za-z0-9]
Run Code Online (Sandbox Code Playgroud)
当我尝试使用该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'
Run Code Online (Sandbox Code Playgroud)
我知道它将正则表达式解释为列表,但是如何使用 yaml 文件中定义的正则表达式来搜索字符串?
问题出在 YAML,而不是 Python。
如果要在 YAML 文件中存储包含文字方括号的字符串值,则必须引用它:
regex:
- '[A-Za-z0-9]'
Run Code Online (Sandbox Code Playgroud)
使用“单引号”意味着 YAML 不会解释正则表达式中的任何反斜杠转义序列。例如\b
另请注意,在此 YAML 中, 的值regex是一个包含一个字符串的列表,而不是一个简单的字符串。
我在我的 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)$')}
Run Code Online (Sandbox Code Playgroud)
如果您想使用 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)$')}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15500 次 |
| 最近记录: |