web-dev-qa-db-ja.com

Pythonのリストの要素が文字列に含まれているかどうかを確認する方法

私はこのようなものを持っています:

extensionsToCheck = ['.pdf', '.doc', '.xls']

for extension in extensionsToCheck:
    if extension in url_string:
        print(url_string)

python(forループを使用しない)でこれを行うためのよりエレガントな方法は何だろうかと思いますか?私はこのようなものを考えていました(c/c ++など)が、うまくいきませんでした:

if ('.pdf' or '.doc' or '.xls') in url_string:
    print(url_string)

編集:潜在的な重複としてマークされている以下の質問とどう違うのかを説明するように強制されます(したがって、閉じられないようです)。

違いは、文字列が文字列のリストの一部であるかどうかを確認したいのに対して、他の質問は文字列のリストの文字列が別の文字列の部分文字列であるかどうかを確認したいことです。あなたはオンラインの私見の答えを探しているとき、似ていますが、まったく同じものではなく、意味論が重要です。これらの2つの質問は、実際には互いに反対の問題を解決しようとしています。しかし、両方の解決策は同じであることが判明しました。

162
pootzko

ジェネレーターをanyと共に使用します。これは最初のTrueで短絡します。

if any(ext in url_string for ext in extensionsToCheck):
    print(url_string)

編集:この回答はOPに受け入れられました。私の解決策は彼の特定の問題に対する「十分な」解決策であり、リスト内の文字列が別の文字列にあるかどうかを確認する一般的な方法ですが、これがこの解決策のすべてであることに注意してください。 文字列が文字列の末尾などで見つかった場所は気にしません。 URLでよくあることですが、これが重要な場合は、@ Wladimir Palantの回答を確認する必要があります。そうしないと、誤検出のリスクがあります。

308
extensionsToCheck = ('.pdf', '.doc', '.xls')

'test.doc'.endswith(extensionsToCheck)   # returns True

'test.jpg'.endswith(extensionsToCheck)   # returns False
29
eumiro

URLを適切に解析することをお勧めします-このようにすると、http://.../file.doc?foohttp://.../foo.doc/file.exeを正しく処理できます。

from urlparse import urlparse
import os
path = urlparse(url_string).path
ext = os.path.splitext(path)[1]
if ext in extensionsToCheck:
  print(url_string)
16
Wladimir Palant

単一行のソリューションが必要な場合は、リスト内包表記を使用します。次のコードは、拡張子が.doc、.pdf、および.xlsの場合はurl_stringを含むリストを返し、拡張子が含まれない場合は空のリストを返します。

print [url_string for extension in extensionsToCheck if(extension in url_string)]

注:これは、含まれているかどうかを確認するためだけであり、拡張子に一致する正確なWordを抽出する場合は役に立ちません。

2
psun

この正規表現と一致するかどうかを確認します。

'(\.pdf$|\.doc$|\.xls$)'

注:拡張機能がURLの末尾にない場合は、$文字を削除しますが、わずかに弱めます

2
user822535

これは、@ psunによって与えられるリスト内包表記の回答の変形です。

出力値を切り替えることで、リスト内包から一致するパターンを実際に抽出できます(@ Lauritz-v-Thaulowによるany()アプローチでは不可能なこと)

extensionsToCheck = ['.pdf', '.doc', '.xls']
url_string = 'http://.../foo.doc'

print [extension for extension in extensionsToCheck if(extension in url_string)]

['.doc'] `

さらに、一致したパターンがわかったら追加情報を収集する場合は、正規表現を挿入できます(これは、許可されたパターンのリストが長すぎて単一の正規表現パターンに書き込むことができない場合に役立ちます)

print [re.search(r'(\w+)'+extension, url_string).group(0) for extension in extensionsToCheck if(extension in url_string)]

['foo.doc']

1
Dannid