【发布时间】:2009-10-27 22:16:53
【问题描述】:
我正在尝试解析满足 python 正则表达式的项目列表
r'\A(("[\w\s]+"|\w+)\s+)*\Z'
也就是说,它是一个空格分隔的列表,除了带引号的字符串中允许有空格。我想获取列表中的项目列表(即与
r'("[\w\s]+"|\w+)'
部分。所以,例如
>>> parse('foo "bar baz" "bob" ')
['foo', '"bar baz"', '"bob"']
有没有什么好的方法可以用 python re 做到这一点?
很多事情都不太行。例如
>>> re.match(r'\A(("[\w\s]+"|\w+)\s+)*\Z', 'foo "bar baz" "bob" ').group(2)
'"bob"'
只返回它匹配的最后一个。另一方面
>>> re.findall(r'("[\w\s]+"|\w+)', 'foo "bar baz" "bob" ')
['foo', '"bar baz"', '"bob"']
但它也接受格式错误的表达式,例如
>>> re.findall(r'("[\w\s]+"|\w+)', 'foo "bar b-&&az" "bob" ')
['foo', 'bar', 'b', 'az', '" "', 'bob']
那么有什么方法可以使用原始正则表达式并获取与第 2 组匹配的所有项目?类似的东西
>>> re.match_multigroup(r'\A(("[\w\s]+"|\w+)\s+)*\Z', 'foo "bar baz" "bob" ').group(2)
['foo', '"bar baz"', '"bob"']
>>> re.match_multigroup(r'("[\w\s]+"|\w+)', 'foo "bar b-&&az" "bob" ')
None
编辑:保留输出中的引号很重要,因此我不想要
>>> re.match_multigroup(r'\A(("[\w\s]+"|\w+)\s+)*\Z', 'foo "bar baz" "bob" ').group(2)
['foo', 'bar baz', 'bob']
因为那时我不知道是否引用了 bob。
【问题讨论】: