Ticket #173 (closed defect: invalid)
Python regular expression named groups breaks (?) pyyaml
| Reported by: | anonymous | Owned by: | xi |
|---|---|---|---|
| Priority: | normal | Component: | pyyaml |
| Severity: | normal | Keywords: | |
| Cc: |
Description
I'm using pyyaml 3.09 in Python 2.6.5 on Ubuntu 10.04 LTS.
I have a yaml file I used for configuration of a web server (tornado), and the section of my file causing issues looks like this:
RequestHandlers: # [ path, handler class, [whitelist] ] - [/stats, myapp.core.Stats, [127.0.0.1, 10.0.0.0/8]] - [r'/(?P<id>.*)', myapp.core.Foo, [127.0.0.1, 192.168.0.0/16]] - [/.*, myapp.core.MainHandler, []]
When this gets loaded, pyyaml yells at me. Here's a python interpreter session:
============================================
Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import yaml
>>> stream = open('etc/subzero.yaml')
>>> config = yaml.load(stream)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "build/bdist.linux-i686/egg/yaml/__init__.py", line 58, in load
File "build/bdist.linux-i686/egg/yaml/constructor.py", line 42, in get_single_data
File "build/bdist.linux-i686/egg/yaml/composer.py", line 36, in get_single_node
File "build/bdist.linux-i686/egg/yaml/composer.py", line 55, in compose_document
File "build/bdist.linux-i686/egg/yaml/composer.py", line 84, in compose_node
File "build/bdist.linux-i686/egg/yaml/composer.py", line 133, in compose_mapping_node
File "build/bdist.linux-i686/egg/yaml/composer.py", line 82, in compose_node
File "build/bdist.linux-i686/egg/yaml/composer.py", line 111, in compose_sequence_node
File "build/bdist.linux-i686/egg/yaml/composer.py", line 82, in compose_node
File "build/bdist.linux-i686/egg/yaml/composer.py", line 110, in compose_sequence_node
File "build/bdist.linux-i686/egg/yaml/parser.py", line 93, in check_event
File "build/bdist.linux-i686/egg/yaml/parser.py", line 479, in parse_flow_sequence_entry
yaml.parser.ParserError: while parsing a flow sequence
in "etc/myapp.yaml", line 35, column 5
expected ',' or ']', but got '?'
in "etc/myapp.yaml", line 35, column 10
============================================
Line 35 is:
- [r'/(?P<id>.*)', myapp.core.Foo, [127.0.0.1, 192.168.0.0/16]]
I'm wondering why it's choking here. Disabling this line causes everything to work perfectly well. The question mark is a special case in YAML, but (I thought) only when it's accompanied by a space. I don't recall ever needing to escape anything inside of a yaml file, but I tried escaping the '?'. Not sure what to try next. If I double-quote like "r'/(?P<id>.*)'" then it'll be a double-quoted string on the other end of the load as well, which doesn't help me.
Clue hereby solicited.

Why do you use the r prefix? It's not supported by YAML the way it is interpreted by Python, instead you'll get a literal string "r'/(?P<id>.*)'". '/(?P<id>.*)' should work just fine, you can even use backslashes without escaping them.