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)"]

カーリー内にあるものは無制限ですが、基本的な一致は次のとおりです。

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

そのため、カーリー内に 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)']

そして、返された値ごとに 2 番目の正規表現を使用できます。

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 に答える