2012-07-10 20 views
5

トークン化/スプリッターのように動作する正規表現のグループと*機能を組み合わせる方法はありますか?Regexグループと*ワイルドカードは一緒に動作できますか?

my_str = "foofoofoofoo" 
pattern = "(foo)*" 
result = re.search(pattern, my_str) 

私は期待していた私のグループは

("foo", "foo", "foo", "foo") 

ように見えるかもしれません。しかし、それはない:私はこれを試してみました。私はこれに驚いたのは?

my_str= "Mr foo" 
pattern = "(Mr)? foo" 
result = re.search(pattern, my_str) 
+3

ですが、あなたは 're.findall(" FOOを使用して欲しいものを得ることができます。

これはあなたに期待される結果を与えるだろうだろう"、" foofoofoofoo ")'。ああ、変数名に 'str'を使わないでください。 –

+0

'str'を' my_str'に変更しました。 'str'は組み込みをシャドウしているからです。 – jamylak

+0

ああ、申し訳ありませんが、strは単なる例でした。そのコードは構文上正しいとは限りません。また、私はfindallメソッドを見て、それは間違いなく動作するでしょう。私はより一般的な意味で興味があっただけです。 –

答えて

4

問題はです。唯一のキャプチャグループを繰り返します。つまり、キャプチャグループが1つしかないことを意味します。このキャプチャグループは、一致するたびに上書きされます。

詳細については、regular-expression.infoのRepeating a Capturing Group vs. Capturing a Repeated Groupを参照してください。 (しかし繰り返しグループのキャプチャはあなたが望むものではありません)

正規表現が完了した後、キャプチャグループ1に最後に見つかった "foo"が含まれます。

my_str = "foofoofoofoo" 
pattern = "foo" 
result = re.findall(pattern, my_str) 

結果は、その後、私はそれが動作しないだろうリスト['foo', 'foo', 'foo', 'foo']

+0

+1はとても役に立つリンクです。ありがとうございました! –

+0

興味深い。ありがとう。 –

3

キャプチャグループをと* reモジュールが組み込まれて動作しません - 代わりのfindAll使用しますと、グループ機能が連携して動作します。

pypiにはregexというライブラリがあります。私はその構文をサポートしていると信じていますし、可変長バックトラッキングなどいくつかの機能があります。

+0

それは物事を説明するでしょう。ありがとう。 –

関連する問題