0

我有以下字符串:

{topic.equals(org.fedoraproject.prod.bodhi.buildroot_override.tag), foo.notequals(bar)}
{topic.in(1,2,3), foo.equals(baz)}

我想得到结果:

["topic.equals(org.fedoraproject.prod.bodhi.buildroot_override.tag)", "foo.notequals(bar)"]
["topic.in(1,2,3)", "foo.equals(baz)"]

curlies 中的内容是无限的,但基本匹配需要是:

<key>.<command>(<args>)

所以curlies里面可能有15个匹配项。

4

2 回答 2

0

我认为这行得通,但由于它不是很优雅,因此需要意见:

column_regex = re.compile("\w+\.\w+\(.+?\)")
results = re.findall(column_regex, data)

这将给出 {} 内的命令结果:

['topic.equals(org.fedoraproject.prod.bodhi.buildroot_override.tag)', 'foo.notequals(bar)']

然后您可以对每个返回值使用第二个正则表达式:

filter_regex = re.compile("^(?P<column>\w+)\.(?P<command>\w+)\((?P<args>.+?)\)")

能够进行匹配并获取值:

filter_match = re.match(filter_regex, match)
filter_match.group('command')
于 2013-01-26T16:50:25.843 回答
0

我会尽可能简单:

entries = []
for line in inputsource:
    entries.append(map(str.strip, line.strip().strip('{}').split(', ')))

因此,对于每一行,先去掉空格,然后再去掉花括号,然后用逗号加空格分隔命令并存储去掉空格的结果。

这取决于命令由逗号加空格分隔的事实,而示例中的参数仅使用不带空格的逗号。如果您有任何违反该差异的内容,那么您确实需要使用正则表达式。我只会将其限制为拆分:

import re
commandsep = re.compile(r'(?<=\)),\s*')

for line in inputsource:
    entries.append(map(str.strip, commandsep.split(line.strip().strip('{}'))))

commandsep表达式在任何逗号加可选空格上拆分,前提是它前面有一个右)括号(使用后视断言)。

对于您的输入,结果是:

>>> entries
[['topic.equals(org.fedoraproject.prod.bodhi.buildroot_override.tag)', 'foo.notequals(bar)'], ['topic.in(1,2,3)', 'foo.equals(baz)']]

如果这些条目嵌入到较大的文本正文中,则正则表达式可能会有所帮助,但只能找到大括号分隔的值:

import re

expression = re.compile(r'{[^{}]+}')
inputsource = expression.findall(largerbodyoftext)

whereexpression将找到由大括号分隔的任何文本(无嵌套)。

于 2013-01-26T15:53:34.333 回答