9

括弧の外側のテキストを正規表現で取得しようとしています。

文字列の例

Josie Smith [3996 COLLEGE AVENUE, SOMETOWN, MD 21003]Mugsy Dog Smith [2560 OAK ST, GLENMEADE, WI 14098]

次の方法で、角括弧内のテキストを正常取得できます。

addrs = re.findall(r"\[(.*?)\]", example_str)
print addrs
[u'3996 COLLEGE AVENUE, SOMETOWN, MD 21003',u'2560 OAK ST, GLENMEADE, WI 14098']    

しかし、角かっこのに何かを取得するのに問題があります。私は次のようなことを試しました:

names = re.findall(r"(.*?)\[.*\]+", example_str)

しかし、それは最初の名前だけを見つけます:

print names
[u'Josie Smith ']

name [address]これまでのところ、1 つから 2 つのコンボを含む文字列しか見ていませんが、文字列にはいくつでもコンボが存在する可能性があると思います。

4

4 に答える 4

12

ネストされたブラケットがない場合は、次のようにするだけです。

re.findall(r'(.*?)\[.*?\]', example_str)

ただし、ここでは正規表現は必要ありません。括弧で分割するだけです:

(s.split(']')[-1] for s in example_str.split('['))

あなたの試みがうまくいかなかった唯一の理由:

re.findall(r"(.*?)\[.*\]+", example_str)

… 括弧内で非貪欲な一致を行っていたということです。つまり、括弧の最初のペアだけをキャプチャするのではなく、最初の開き括弧から最後の閉じ括弧まですべてをキャプチャしていたことを意味します。


また、+最後のは間違っているようです。もしあなたが を持っていたら、あなたは'abc [def][ghi] jkl[mno]'戻りたいですか['abc ', '', ' jkl']、それとも['abc ', ' jkl']? 前者の場合は、. を追加しないでください+。後者の場合は実行しますが、括弧で囲まれたパターン全体を非キャプチャ グループに入れる必要があります: r'(.*?)(?:\[.*?\])+.


最後のブラケットの後に追加のテキストがある場合、splitメソッドは正常に機能するか、re.split代わりにre.findall… を使用できますが、元の正規表現を調整してそれで動作するようにしたい場合は、できます。

英語では、角かっこで囲まれた部分文字列または文字列の末尾の前の (貪欲ではない) 部分文字列が必要ですよね?

そのため、 と を交互に切り替える必要があり\[.*?\]ます$。もちろん、オルタネーションを書き込むためにそれをグループ化する必要があり、グループをキャプチャしたくありません。そう:

re.findall(r"(.*?)(?:\[.*?\]|$)", example_str)
于 2013-06-24T20:59:59.040 に答える
5

ネストされたブラケットがない場合:

([^[\]]+)(?:$|\[)

例:

>>> import re
>>> s = 'Josie Smith [3996 COLLEGE AVENUE, SOMETOWN, MD 21003]Mugsy Dog Smith [2560 OAK ST, GLENMEADE, WI 14098]'
>>> re.findall(r'([^[\]]+)(?:$|\[)', s)
['Josie Smith ', 'Mugsy Dog Smith ']

説明:

([^[\]]+)   # match one or more characters that are not '[' or ']' and place in group 1
(?:$|\[)    # match either a '[' or at the end of the string, do not capture
于 2013-06-24T21:01:24.743 に答える
2

あなたはこれを行うことができます:

 outside = re.findall(r"[^[]+(?=\[[^]]*]|$)", example_str)

言い換えると: 開始角かっこの後に角かっこ内の何かが続くか、または文字列の末尾ではないすべて

于 2013-06-24T20:59:50.140 に答える