我有以下字符串:
{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)"]卷曲中的内容是无限的,但基本的匹配需要是:
<key>.<command>(<args>)所以卷曲里可能有15根火柴。
发布于 2013-01-26 23:53:34
我会尽量保持简单:
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)其中expression将找到任何由大括号分隔的文本(没有嵌套)。
发布于 2013-01-27 00:50:26
我认为这是可行的,但我希望得到一些意见,因为它不是很优雅:
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')https://stackoverflow.com/questions/14538588
复制相似问题