পাইথনের কোনও তালিকা থেকে কোনও স্ট্রিংয়ের উপাদান রয়েছে কিনা তা কীভাবে পরীক্ষা করবেন


217

আমার এরকম কিছু রয়েছে:

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

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

আমি ভাবছি পাইথন (লুপের জন্য ব্যবহার না করে) এটি করার আরও মার্জিত উপায় কী হবে? আমি এরকম কিছু (সি / সি ++ এর মতো) সম্পর্কে ভাবছিলাম, তবে এটি কার্যকর হয়নি:

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

সম্পাদনা: আমি নীচের প্রশ্নের সম্ভাব্য নকল হিসাবে চিহ্নিত হিসাবে এটি কীভাবে আলাদা তা ব্যাখ্যা করতে বাধ্য হচ্ছি (যাতে এটি বন্ধ হয়ে যায় না আমার ধারণা)।

পার্থক্যটি হ'ল, আমি যাচাই করতে চেয়েছিলাম যে স্ট্রিং কিছু স্ট্রিংয়ের তালিকার অংশ কিনা অন্য প্রশ্নটি স্ট্রিংয়ের তালিকা থেকে স্ট্রিংটি অন্য স্ট্রিংয়ের একটি স্ট্রিং কিনা তা পরীক্ষা করে দেখছে। অনুরূপ, তবে আপনি যখন অনলাইন আইএমএইচও-র উত্তর খুঁজছেন তখন একই রকম এবং শব্দার্থবিজ্ঞানের বিষয়টি নয় matter এই দুটি প্রশ্নই একে অপরের বিপরীত সমস্যা সমাধানের দিকে তাকিয়ে রয়েছে। উভয়ের জন্য সমাধানটি একই হতে পারে।


উত্তর:


420

একসাথে একটি জেনারেটর ব্যবহার করুন any, যা প্রথম সত্যের শর্ট সার্কিট:

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

সম্পাদনা: আমি দেখছি এই উত্তরটি ওপি গ্রহণ করেছে। যদিও আমার সমাধানটি তার নির্দিষ্ট সমস্যার "যথেষ্ট যথেষ্ট" সমাধান হতে পারে, এবং তালিকার কোনও স্ট্রিং অন্য স্ট্রিংয়ে পাওয়া গেছে কিনা তা যাচাই করার একটি ভাল সাধারণ উপায়, মনে রাখবেন যে এই দ্রবণটি যা কিছু করে তা এটি is স্ট্রিংটি কোথায় পাওয়া যায় সেটির কোনও গুরুত্ব নেই । যদি এটি গুরুত্বপূর্ণ হয়, যেমন প্রায়শই ইউআরএলগুলির ক্ষেত্রে হয়, আপনার @ ওলাদিমির প্যাল্যান্টের উত্তরের দিকে নজর দেওয়া উচিত, অথবা আপনার মিথ্যা ধনাত্মক হওয়ার ঝুঁকি রয়েছে।


1
এই আমি ঠিক খুঁজছিলাম ছিল। আমার ক্ষেত্রে এটি স্ট্রিংয়ের যেখানে এক্সটেনশান তা বিবেচ্য নয়। ধন্যবাদ
pootzko

দুর্দান্ত পরামর্শ। এই উদাহরণটি ব্যবহার করে, আমি এটি যাচাই করেছিলাম যে কোনও যুক্তি সুপরিচিত সহায়তা পতাকাগুলির সাথে মিলেছে কিনা: কোনও ([x.lower () [[-? ',' - এইচ ',' - সহায়তা ',' / এইচ '] x এর জন্য sys.argv [1:]])
ল্যাবস

ভিতরে তালিকা বোধগম্যতা ব্যবহার করে @ এ্যাক্স-ল্যাবগুলি anyসংক্ষিপ্ত সার্কিটের প্রদত্ত কিছু সম্ভাব্য উপকারকে অস্বীকার করবে কারণ পুরো তালিকাটি প্রতিটি ক্ষেত্রেই তৈরি করতে হবে। আপনি যদি বর্গক্ষেত্র বন্ধনী ( any(x.lower() in ['-?','-h','--help', '/h'] for x in sys.argv[1:])) ছাড়াই প্রকাশটি ব্যবহার করেন তবে x.lower() in [...]সত্যিকারের মান না পাওয়া পর্যন্ত অংশটি কেবলমাত্র মূল্যায়ন করা হবে।
লরিজ ভি ভি থালো

5
এবং যদি আমি জানতে চাই যে যখন কোনও () সত্য হয় তখন এক্সটি কী?
পিটার সেন্না

@ পিটারসেনা: any()কেবলমাত্র সত্য বা মিথ্যা প্রত্যাবর্তন করবে , তবে নীচের এই সংশোধনীর মাধ্যমে print [extension for extension in extensionsToCheck if(extension in url_string)]
@ পিএসসি'র

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

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

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

5
এটি চতুর - আমি জানতাম না যে টিপলস এটি করতে পারে !, তবে এটি তখনই কাজ করে যখন আপনার স্ট্রিংয়ের স্ট্রিংয়ের এক প্রান্তে নোঙ্গর করা থাকে।
ড্যানিড

3
অনেক ভাল. আমার কেবল ইচ্ছে আছে যে কেবল সূচনা বা প্রান্তবিশেষের চেয়ে "রয়েছে" এর মতো কিছু ছিল
BrDaHa

@BrDaHa- এর জন্য আপনি 'ইন' ব্যবহার করতে পারেন। তালিকায় যদি 'স্ট্রিং' থাকে:
শেখর সামন্ত

@ শেখারসামন্ত নিশ্চিত, তবে এটি একাধিক জিনিসের কোনও একটি স্ট্রিংয়ে আছে কিনা তা যাচাইয়ের সমস্যার সমাধান করতে পারে না, যা মূল প্রশ্নটি ছিল।
বিআরডাহা

হ্যাঁ সেক্ষেত্রে আমরা ব্যবহার করতে পারি: যদি কোনও (তালিকার উপাদানগুলির জন্য স্ট্রিং.স্প্লিটে উপাদান ('কোনও প্রেরক')) এবং স্ট্রিংয়ের জন্য যদি থাকে (তালিকার উপাদানগুলির জন্য স্ট্রিংয়ের উপাদান)
শেখর সামন্ত

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
এটি একটি ইউআরএল, যদি এটির কোয়েরি স্ট্রিং থাকে?
ও্লাদিমির পালান্ট

পুনরায় আমদানি করুন পুনরায় অনুসন্ধান (প্যাটার্ন, আপনার_ স্ট্রিং)
জুনানকিমিথ

যদিও এই উত্তরটি নির্দিষ্ট ক্ষেত্রে ব্যবহার করে, এটি স্কেলযোগ্য বা জেনেরিক নয়। আপনি যে প্যাটার্নটি মেলে দেখতে চান তার জন্য আপনাকে একটি দীর্ঘ রেইজেক্স দরকার।
ড্যানিড

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']

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.