7

文字列のさまざまな部分を一致させ、後で使用するためにそれらを個別の変数に保存したいと考えています。例えば、

string = "bunch(oranges, bananas, apples)"
rxp = "[a-z]*\([var1]\, [var2]\, [var3]\)"

私が持っているように

var1 = "oranges"
var2 = "bananas"
var3 = "apples"

re.search() が行うことと似ていますが、同じ一致の複数の異なる部分に対してです。

編集: リスト内の果物の数は事前にわかりません。これを質問に入れる必要がありました。

4

4 に答える 4

4

groupdict必要に応じて、一致するアイテムを辞書に保存するために使用できます。

regex = re.compile("[a-z]*\((?P<var1>.*)\, (?P<var2>.*)\, (?P<var3>.*)")
match = regex.match("bunch(oranges, bananas, apples)")
if match:
    match.groupdict()

#{'var1': 'oranges', 'var2': 'bananas', 'var3': 'apples)'}
于 2012-11-18T21:33:05.670 に答える
4

それがそうですre.search。後で特定のサブパターンに一致したものにアクセスするには、キャプチャ グループ (括弧) を使用するだけです。

>>> import re
>>> m = re.search(r"[a-z]*\(([a-z]*), ([a-z]*), ([a-z]*)\)", string)
>>> m.group(0)
'bunch(oranges, bananas, apples)'
>>> m.group(1)
'oranges'
>>> m.group(2)
'bananas'
>>> m.group(3)
'apples'

また、二重のバックスラッシュを避けるために生の文字列を使用したことにも注意してください。

内部の「変数」の数bunchが異なる場合は、問題があります。ほとんどの正規表現エンジンは、可変数の文字列をキャプチャできません。ただし、その場合、これで逃げることができます:

>>> m = re.search(r"[a-z]*\(([a-z, ]*)\)", string)
>>> m.group(1)
'oranges, bananas, apples'
>>> m.group(1).split(', ')
['oranges', 'bananas', 'apples']
于 2012-11-18T21:19:39.503 に答える
4

正規表現の場合、match()関数を使用して目的を実行し、グループを使用して結果を取得できます。また、単語 に代入しないでください。これstringは組み込み関数であるためです (非推奨ですが)。あなたの例では、毎回同じ数の果物があることがわかっている場合、次のようになります。

import re
input = "bunch(oranges, bananas, apples)"
var1, var2, var3 = re.match('bunch\((\w+), (\w+), (\w+)\)', input).group(1, 2, 3)

ここでは、ドキュメント\wで説明されているように、任意の英数字またはアンダースコアに一致する特別なシーケンスを使用しました

事前に果物の数がわからない場合は、2 つの正規表現呼び出しを使用できます。1 つは、果物がリストされている文字列の最小部分を抽出し、「束」と括弧を取り除き、finditer抽出果物の名前:

import re
input = "bunch(oranges, bananas, apples)"
[m.group(0) for m in re.finditer('\w+(, )?', re.match('bunch\(([^)]*)\)', input).group(1))] 
于 2012-11-18T21:21:40.220 に答える
1

しないでください。var1、var2 などを使用するたびに、実際にはリストが必要になります。残念ながら、これは を使用してリスト内の任意の数のサブグループを収集する方法ではありませんfindallが、次のようなハックを使用できます。

import re
lst = []
re.sub(r'([a-z]+)(?=[^()]*\))', lambda m: lst.append(m.group(1)), string)
print lst # ['oranges', 'bananas', 'apples']

これは、この特定の例だけでなく、任意の数の部分文字列に対しても機能することに注意してください。

于 2012-11-18T21:22:31.297 に答える