2

reモジュールについて助けが必要です。私はパターンを持っています:

pattern = re.compile('''first_condition\((.*)\)
extra_condition\((.*)\)
testing\((.*)\)
other\((.*)\)''', re.UNICODE)

次のテキストに対して正規表現を実行すると、次のようになります。

text = '''first_condition(enabled)
extra_condition(disabled)
testing(example)
other(something)'''
result = pattern.findall(text)
print(result)
[('enabled', 'disabled', 'example', 'something')]

しかし、1 行または 2 行が抜けていた場合、正規表現は空のリストを返します。たとえば、私のテキストは次のとおりです。

text = '''first_condition(enabled)
other(other)'''

私が取得したいもの:

[('enabled', '', '', 'something')]

いくつかのコマンドで実行できますが、1 つの正規表現で実行するよりも遅くなると思います。オリジナルコードはsedを使っているのでとても速いです。sedを使用して実行できますが、クロスプラットフォームの方法が必要です。することは可能ですか?タンクス!

PS文字列のシーケンスが固定ではなく自由になるのも素晴らしいことです:

text = '''other(other)
first_condition(enabled)'''

絶対に同じものを返す必要があります:

[('enabled', '', '', 'something')]
4

2 に答える 2

4

最初に辞書に解析します。

import re

keys = ['first_condition', 'extra_condition', 'testing', 'other'] 
d = dict(re.findall(r'^(.*)\((.*)\)$', text, re.M))
result = [d.get(key, '') for key in keys]

オンラインでの動作を確認してください: ideone

于 2012-05-17T21:27:15.523 に答える
0

オプションのものには一致しないグループを使用し、グループの後に疑問符を付けてグループをオプションにします。

例:

pat = re.compile(r'a\(([^)]+)\)(?:b\((?P<bgr>[^)]+)\)?')

申し訳ありませんが、現在これをテストすることはできません。

上記では、次のような文字列が必要でa(foo)、親のテキストをグループ 0 として取得します。

次に、オプションで次のような文字列に一致し、b(foo)一致した場合は名前付きの名前付きグループとして保存されます。bgr

.*かっこ内で一致させるために使用しなかったことに注意してください[^)]+。これは、閉じ括弧に達すると一致を確実に停止し、少なくとも 1 文字が必要です。[^)]*括弧を空にできる場合に使用できます。

これらのパターンは複雑になるため、コメント付きの詳細なパターンを使用することをお勧めします。

任意の順序で表示される可能性のあるいくつかのオプションのパターンを含めるには、それらをすべて一致しないグループ内に配置し、垂直バーで区切ります。順序がわからないため、名前付き一致グループを使用する必要があります。一致しないグループの後にアスタリスクを付けて、任意の数の代替パターンが存在できるようにします (存在しない場合はゼロを含む)。

于 2012-05-17T21:22:36.237 に答える