1

Python Cookbook 3rd Edition の第 2 章、セクション 2.1 には、次の内容があります。

>>> line = 'asdf fjdk; afed, fjek,asdf,      foo'
>>> import re
>>> re.split(r'[;,\s]\s*', line)
['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']

はい、それは良い例です...しかし、正規表現の を削除して試してみると\s*、同じ効果があります...以下を参照してください。

>>> re.split(r'[;,\s]*', line)
['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']

では、作成者は冗長性\s*を他の目的に役立つようにするために何を考えていますか?

入力してください。

4

2 に答える 2

3

私は本を​​持っていないので、著者の意図はわかりません。しかし、David Beazley は非常に鋭いので、これら 2 つの行の出力を区別するためだったと推測できます。

>>> line = 'asdf fjdk; afed, fjek,asdf,      foo'
>>> line = 'asdf fjdk; ; afed, fjek,asdf,      foo'

本の正規表現を使用すると、2 行目は次のようになります。

['asdf', 'fjdk', '', 'afed', 'fjek', 'asdf', 'foo']

そして、修正した正規表現を使用して

['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']

正規表現は[;,\s]、一致グループにない文字で区切られていないグループ内のすべてのシンボルを折りたたみます。

于 2014-05-29T04:15:36.530 に答える
1

どちらも正規表現が異なります。

  • 最初の正規表現は、区切り文字はコンマ、セミコロン、またはオプションでスペースが続くスペースのいずれかである必要があることを示しています

  • 2 番目の正規表現は、区切り文字は 1 つ以上のコンマ、セミコロン、またはスペースのいずれかである必要があることを示しています。

したがって、定義によれば、次の文字列に正規表現を適用すると、違いを簡単に見つけることができます

line = 'asdf fjdk;; afed, fjek,asdf,      foo'

したがって、結果は今では異なります

>>> re.split(r'[;,\s]*', line)
['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']
>>> re.split(r'[;,\s]\s*', line)
['asdf', 'fjdk', '', 'afed', 'fjek', 'asdf', 'foo']

ここで、必要な正規表現は、作業する入力と、受け入れ可能なすべてのテスト ケースの目的の出力によって異なります。

于 2014-05-29T04:16:50.017 に答える