8

タスク:
- 指定: 画像ファイル名のリスト
- todo: 「サム」という単語を含まないファイル名で新しいリストを作成します。つまり、サムネイル以外の画像のみをターゲットにします (PIL - Python Imaging Library を使用)。

試しましr".*(?!thumb).*"たが失敗しました。

^正規表現の先頭に a を追加.*し、否定先読みに挿入する解決策 (ここでは stackoverflow) を見つけましたr"^(?!.*thumb).*"。これで機能するようになりました。

問題は、最初の解決策がうまくいかなかった理由を理解したいのですが、うまくいかないということです。正規表現は非常に複雑なので、理解したいと思います。

私が理解しているの^は、次の条件が文字列の先頭で一致することをパーサーに伝えることです。しかし.*、(動作していない) 最初の例も文字列の先頭から始まっていませんか? 文字列の先頭から開始し、「親指」に到達する前にできるだけ多くの文字を検索すると思いました。もしそうなら、それは不一致を返します。

誰かがなぜr".*(?!thumb).*"機能しないのか説明してもらえr"^(?!.*thumb).*"ますか?

ありがとう!

4

3 に答える 3

6

誰かがなぜr".*(?!thumb).*"機能しないの か説明してもらえr"^(?!.*thumb).*"ますか?

最初のものはすべての文字列を消費するため、常に一致し.*ます (そのため、否定的な先読みが失敗するために何かが続くことはありません)。2 番目は少し複雑で、行頭から「親指」に遭遇するまでの最も多くの文字と一致し、それが存在する場合は、行が何かで始まり、その後に「親指」が続くため、一致全体が失敗します。 .

2 番目は、次のように簡単に記述できます。

  • 'thumb' not in string
  • not re.search('thumb', string)(マッチの代わりに)

また、コメントで述べたように、あなたの質問は次のように述べています。

「親指」という単語を含まないファイル名

thumbs upしたがって、 を除外するかどうかを検討することをお勧めします。

于 2012-12-14T03:25:26.090 に答える
3

(くそー、ジョンは私を打ち負かしました。まあ、とにかく例を見ることができます)

他の人が言ったように、正規表現はこの仕事に最適なツールではありません. ファイルパスを扱っている場合は、 os.pathを見てください。

不要なファイルのフィルタリングについてはif 'thumb' not in filename: ...、パスを分析したら実行できます (どこfilenameにあるstr)。

そして後世のために、これらの正規表現に関する私の考えを以下に示します。は貪欲であり、先読みの優先度が非常に低いr".*(?!thumb).*"ため、機能しません。.*これを見てください:

>>> re.search('(.*)((?!thumb))(.*)', '/tmp/somewhere/thumb').groups()
('/tmp/somewhere/thumb', '', '')
>>> re.search('(.*?)((?!thumb))(.*)', '/tmp/somewhere/thumb').groups()
('', '', '/tmp/somewhere/thumb')
>>> re.search('(.*?)((?!thumb))(.*?)', '/tmp/somewhere/thumb').groups()
('', '', '')

ラストはかなり微妙…

他の正規表現 ( r"^(?!.*thumb).*").*は先読み内にあるため機能するため、文字が盗まれるという問題はありません。または^を使用しているかどうかによっては、実際には も必要ありません。re.matchre.search

>>> re.search('((?!.*thumb))(.*)', '/tmp/somewhere/thumb').groups()
('', 'humb')
>>> re.search('^((?!.*thumb))(.*)', '/tmp/somewhere/thumb').groups()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'groups'
>>> re.match('((?!.*thumb))(.*)', '/tmp/somewhere/thumb').groups()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'groups'
于 2012-12-14T03:44:42.607 に答える
1

正規表現に関するすべてのビットを無視すると、タスクは比較的単純に見えます。

  • 指定: 画像ファイル名のリスト
  • todo: ファイル名に「thumb」という単語を含まない新しいリストを作成します。つまり、サムネイル以外の画像のみをターゲットにします (PIL - Python Imaging Library を使用)。

次のようなファイル名のリストがあるとします。

filenames = [ 'file1.jpg', 'file1-thumb.jpg', 'file2.jpg', 'file2-thumb.jpg' ]

次に、次のように、thumb という単語を含まないファイルのリストを取得できます。

not_thumb_filenames = [ filename for filename in filenames if not 'thumb' in filename ]

これがリスト内包表記と呼ばれるもので、基本的には次の省略形です。

not_thumb_filenames = []
for filename in filenames:
  if not 'thumb' in filename:
    not_thumb_filenames.append(filename)

この単純なタスクには、正規表現は実際には必要ありません。

于 2012-12-14T03:07:44.463 に答える