यह जांचने के लिए कि पायथन में एक स्ट्रिंग में एक तत्व शामिल है या नहीं


217

मेरे पास कुछ इस तरह है:

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

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

मैं सोच रहा हूं कि पायथन (लूप के लिए उपयोग किए बिना) में ऐसा करने के लिए और अधिक सुरुचिपूर्ण तरीका क्या होगा? मैं इस तरह से कुछ सोच रहा था (जैसे C / C ++ से), लेकिन यह काम नहीं किया:

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

संपादित करें: मैं यह बताने के लिए मजबूर हूं कि यह नीचे दिए गए प्रश्न से अलग कैसे है, जो संभावित डुप्लिकेट के रूप में चिह्नित है (इसलिए यह बंद नहीं होता है मुझे लगता है)।

अंतर यह है, मैं यह जांचना चाहता था कि क्या स्ट्रिंग स्ट्रिंग की कुछ सूची का हिस्सा है, जबकि दूसरा प्रश्न यह जांच रहा है कि क्या स्ट्रिंग की सूची से एक स्ट्रिंग दूसरे स्ट्रिंग का विकल्प है। जब आप ऑनलाइन IMHO के उत्तर की तलाश में होते हैं तो समान, लेकिन काफी समान और शब्दार्थ विषय नहीं। ये दोनों प्रश्न वास्तव में एक दूसरे की विपरीत समस्या को हल करने के लिए देख रहे हैं। दोनों के लिए समाधान हालांकि एक ही हो जाता है।


जवाबों:


420

जनरेटर के साथ एक साथ प्रयोग करें any, जो पहले सच पर शॉर्ट-सर्किट:

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

संपादित करें: मैं देखता हूं कि यह उत्तर ओपी द्वारा स्वीकार किया गया है। यद्यपि मेरा समाधान उसकी विशेष समस्या का "अच्छा पर्याप्त" समाधान हो सकता है, और यह जांचने का एक अच्छा सामान्य तरीका है कि क्या किसी सूची में कोई तार किसी अन्य स्ट्रिंग में पाए जाते हैं, ध्यान रखें कि यह सब है जो यह समाधान करता है। यह परवाह नहीं करता है कि स्ट्रिंग के अंत में स्ट्रिंग कहां पाया जाता है । यदि यह महत्वपूर्ण है, जैसा कि अक्सर यूआरएल के साथ होता है, तो आपको @Wladimir Palant के उत्तर को देखना चाहिए, या आपको झूठी सकारात्मकता प्राप्त करने का जोखिम उठाना चाहिए।


1
यह ठीक वही है जिसकी मुझे तलाश थी। मेरे मामले में यह मायने नहीं रखता कि स्ट्रिंग में विस्तार कहां है। धन्यवाद
पूतज़को

शानदार सुझाव। इस उदाहरण का उपयोग करते हुए, यह है कि मैं कैसे जांचता हूं कि कोई भी तर्क प्रसिद्ध मदद के झंडे को परिपक्व करता है: किसी भी ([x --lower () में ['-?', '- h', '- help', '/ h? '] x के लिए sys.argv [1:]] में)
AX लैब्स

@ एक्स-लैब्स के अंदर लिस्ट कॉम्प्रिहेंशन का उपयोग anyकरने से कुछ संभावित लाभ जो कि कम सर्कुलेटिंग प्रदान करते हैं, को नकार देंगे, क्योंकि पूरी सूची को हर मामले में बनाना होगा। यदि आप वर्गाकार कोष्ठक ( any(x.lower() in ['-?','-h','--help', '/h'] for x in sys.argv[1:])) के बिना अभिव्यक्ति का उपयोग करते हैं , तो x.lower() in [...]भाग का मूल्यांकन केवल तब तक किया जाएगा जब तक कि एक सही मान न मिल जाए।
लॉरिट्ज वी। थुलोव

5
और अगर मैं जानना चाहता हूं कि कोई भी कब () सही है?
पीटर सेना

@PeterSenna: any()केवल सही या गलत लौटाएगा, लेकिन इस संशोधन के साथ नीचे दिए गए @psun की सूची समझने का उत्तर देखें:print [extension for extension in extensionsToCheck if(extension in url_string)]
Dannid

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

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

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

5
यह एक चतुर है - मुझे नहीं पता था कि ट्यूपल्स ऐसा कर सकते थे!, लेकिन यह केवल तभी काम करता है जब स्ट्रिंग के एक छोर पर आपका एंकरिंग हो।
Dannid

3
बहुत कूल। मेरी इच्छा है कि कुछ ऐसा ही हो जिसमें "केवल" शामिल हो, केवल शुरूवात या अंत के साथ
BrDaHa

@BrDaHa में आप 'for' का उपयोग कर सकते हैं। अगर सूची में 'स्ट्रिंग':
शेखर सामंत

@ShekharSamanta सुनिश्चित है, लेकिन यह जाँचने की समस्या को हल नहीं करता है कि क्या एक से अधिक चीजें एक स्ट्रिंग में हैं, जो कि मूल प्रश्न के बारे में था।
ब्रदाह

उस स्थिति में हम उपयोग कर सकते हैं: यदि कोई हो (तत्व में string.split ('any delmiter') तत्व के लिए सूची में) और स्ट्रिंग के लिए यदि कोई हो (तत्व के लिए स्ट्रिंग में सूची में तत्व)
Shekhar Samanta

21

URL को ठीक से पार्स करना बेहतर है - इस तरह से आप संभाल सकते हैं http://.../file.doc?fooऔर http://.../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)

3

यदि आप एकल पंक्ति समाधान चाहते हैं तो सूची समझ का उपयोग करें। निम्न कोड एक सूची देता है जिसमें एक्सटेंशन .doc, .pdf और .xls होने पर url_string शामिल होता है और जब इसमें एक्सटेंशन नहीं होता है तो खाली सूची देता है।

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

नोट: यह केवल यह जांचने के लिए है कि इसमें सम्‍मिलित है या नहीं और उपयोगी नहीं है, जब कोई एक्सटेंशन से मेल खाते हुए सटीक शब्द निकालना चाहता है।


यह anyसमाधान की तुलना में अधिक पठनीय है , यह मेरी राय में उस प्रश्न के लिए सबसे अच्छा संभव समाधानों में से एक है।
दिमित्री वेरहोत्रोव

यह any()मेरी राय में समाधान से बेहतर है क्योंकि विशिष्ट मिलान मूल्य को वापस करने के लिए इसे बदल दिया जा सकता है, जैसे कि: print [extension for extension in extensionsToCheck if(extension in url_string)](अतिरिक्त विवरण के लिए मेरा उत्तर देखें और मिलान शब्द और साथ ही url_string से पैटर्न कैसे निकालें )
दानीद

2

जांचें कि क्या यह इस रेक्स से मेल खाता है:

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

नोट: यदि आप एक्सटेंशन url के अंत में नहीं हैं, तो $वर्ण हटा दें , लेकिन यह इसे थोड़ा कमजोर करता है


1
यह एक URL है, अगर इसमें क्वेरी स्ट्रिंग है तो क्या होगा?
व्लादिमीर पलंत

import re re.search (पैटर्न, your_string)
juankysmith

हालांकि यह जवाब निर्दिष्ट मामले के लिए काम करता है, यह स्केलेबल या सामान्य नहीं है। आपको हर उस पैटर्न के लिए लंबे रेगेक्स की आवश्यकता होगी, जिसे आप मैच करना चाहते हैं।
Dannid

1

यह @psun द्वारा दिए गए सूची समझ जवाब का एक प्रकार है।

आउटपुट मान स्विच करके, आप वास्तव में सूची समझ से मेल खाने वाले पैटर्न को निकाल सकते हैं ( 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']

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.