2013-06-24 10 views
5

大括弧で囲まれたテキストを正規表現で取得しようとしています。正規表現以外のすべてのテキストを取得する正規表現

例文字列

ジョージー・スミス[3996 COLLEGE AVENUE、SOMETOWN、MD 21003] Mugsy犬スミス [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] 2にコンボを含む文字列を見てきましたが、私は」私は、次のようなものを試してみました文字列内に任意の数の文字列が存在することが想定されます。

+1

ブラケットをネストすることができます – aaronman

+0

@aaronmanネストされた括弧はありません。良い質問。 – Banjer

答えて

7

の終わりに続いてオープニング角括弧ではありません、あなただけのこの操作を行うことができます。

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

をただし、あなたも本当に正規表現に彼を必要としません再。ただ、カッコで分割:

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

が唯一の理由は、あなたの試みはうまくいきませんでした:

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

...あなたはそれを意味し、括弧内の非欲張りマッチをやっていたということです最初のカッコのペアをキャプチャするのではなく、最初のカッコから最後のカッコまですべてをキャプチャしていました。


また、最後に+は間違っているようです。​​がある場合は、['abc ', '', ' jkl']、または['abc ', ' jkl']に戻ってもらいたいですか?前者の場合は、+を追加しないでください。後者の場合は、-の非捕捉グループに括弧で囲まれたパターンを入れる必要があります。


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

英語では、括弧で囲まれた部分文字列の前の任意の(貪欲でない)部分文字列があります。または文字列の最後ですか?

したがって、\[.*?\]$の間の交替が必要です。もちろん、あなたはそれをグループ化して交替を書く必要があり、あなたはそのグループを捕まえたくありません。だから、:

re.findall(r"(.*?)(?:\[.*?\]|$)", example_str) 
+0

最後の括弧の後に*のテキストがある場合はどうなりますか? (あなたの正規表現だけを参照して、あなたの分割ソリューションが動作します) –

+0

ああ、それはすべて理にかなっています。私は「スプリット」解決策が自分自身のほうが好きです。 – Banjer

+0

@TimPietzcker:OPの元の正規表現と同じスタイルで追加できます。ちょっと複雑なのは、それを書く明白な方法が非キャプチャグループを必要とするということです。方法を示す答えを編集しました。 – abarnert

1

あなたはこれを行うことができます。つまり

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

を:ネストされた括弧が存在しない場合はすべてのこと、角括弧内の何かまたは文字列

3

することは決してネストされた括弧がある場合:

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

例:

>>> 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 
+0

これは、@ abamertのような空の文字列を返さないため、より効果的です –

1

あなたはまだ正規表現と一緒に行きたい場合は入れ子にされた括弧を処理するには、次のものを使用できます:

import re 
expr = re.compile("(?:^|])([^[\]]+)(?:\[|$)") 

print(expr.findall("myexpr[skip this[and this]]another[and skip that too]")) 

これは['myexpr', 'another']となります。

アイデアは、文字列の先頭と文字列の末尾の間にあるものと一致するものであるか、[です。

関連する問題