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 ファイルで定義された正規表現を使用して文字列を検索するにはどうすればよいですか?

4

3 に答える 3

4

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)$')}
于 2015-04-22T21:16:17.183 に答える
3

問題は Python ではなく YAML にあります。
YAML ファイルにリテラル角括弧を含む文字列値を保存する場合は、引用符で囲む必要があります。

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

「一重引用符」の使用は、YAML が正規表現のバックスラッシュ エスケープ シーケンスを解釈しないことを意味します。例えば\b

また、この YAML では、 の値は単純な文字列ではなく、1 つの文字列を含むリストであることに注意しregexてください

于 2012-05-27T02:14:57.767 に答える
3

ファイルで 2 つのリスト構造を使用してい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]'

...これは間違いなくはるかに単純です。

于 2012-05-27T02:17:22.183 に答える