প্রথম ম্যাচ রেজেক্সের সাথে স্ট্রিং ফেরত দিন


90

আমি একটি রেজেক্সের প্রথম ম্যাচটি পেতে চাই।

এই ক্ষেত্রে, আমি একটি তালিকা পেয়েছি:

text = 'aa33bbb44'
re.findall('\d+',text)

['33', '44']

আমি তালিকার প্রথম উপাদানটি বের করতে পারি:

text = 'aa33bbb44'
re.findall('\d+',text)[0]

'33'

তবে এটি শুধুমাত্র তখনই কাজ করে যদি কমপক্ষে একটি ম্যাচ হয়, অন্যথায় আমি একটি ত্রুটি পেয়ে যাব:

text = 'aazzzbbb'
re.findall('\d+',text)[0]

সূচিপত্র: তালিকা সূচকের বাইরে

কোন ক্ষেত্রে আমি একটি ফাংশন সংজ্ঞায়িত করতে পারি:

def return_first_match(text):
    try:
        result = re.findall('\d+',text)[0]
    except Exception, IndexError:
        result = ''
    return result

কোনও নতুন কার্যকারিতা সংজ্ঞায়িত না করে ফলাফলটি পাওয়ার কোনও উপায় আছে কি?


আমার জন্য গৃহীত উত্তর কার্যকর হয়নি। আমাকে অ্যারে সূচক অ্যাক্সেসটি সরিয়ে ফেলতে হয়েছিল এবং len(re.findAll)==0পরিবর্তে চেক ব্যবহার করতে হয়েছিল।
বিশাল

উত্তর:


104

আপনি এটি ''যোগ করে আপনার রিজেক্সে ডিফল্ট এম্বেড করতে পারেন |$:

>>> re.findall('\d+|$', 'aa33bbb44')[0]
'33'
>>> re.findall('\d+|$', 'aazzzbbb')[0]
''
>>> re.findall('\d+|$', '')[0]
''

re.searchঅন্যদের দ্বারা চিহ্নিত হিসাবে কাজ করে:

>>> re.search('\d+|$', 'aa33bbb44').group()
'33'
>>> re.search('\d+|$', 'aazzzbbb').group()
''
>>> re.search('\d+|$', '').group()
''

দুর্দান্ত, অনুসন্ধান /। গোষ্ঠীর কী ফাইন্ডল / [0] এর চেয়ে কোনও সুবিধা আছে?
লুইস রামন রামিরেজ রদ্রিগেজ

6
@ লুইস্রামনরমিরিজ রডরিগেজ ওয়েল এটি একটি ম্যাচটি পাওয়া মাত্রই থামতে পারে, বাকী পাঠ্য প্রক্রিয়া করতে হবে না এবং সমস্ত ম্যাচ সংরক্ষণ করতে হবে না। সুতরাং এটি আরও দক্ষ। এছাড়াও, এটি আক্ষরিক "আপনি যা চান" , যেমনটি @ টিমপিটারগুলি বলেছে। আপনি বা অন্য কেউ যখন এটি পড়েন এবং "কেন findallব্যবহার করা হয়েছিল ?" অবাক হয়ে ভাবলে এটি সুবিধা হতে পারে ?
স্টিফান পোচম্যান

43

আপনার যদি কেবল প্রথম ম্যাচ প্রয়োজন হয় তবে এর re.searchপরিবর্তে ব্যবহার করুন re.findall:

>>> m = re.search('\d+', 'aa33bbb44')
>>> m.group()
'33'
>>> m = re.search('\d+', 'aazzzbbb')
>>> m.group()
Traceback (most recent call last):
  File "<pyshell#281>", line 1, in <module>
    m.group()
AttributeError: 'NoneType' object has no attribute 'group'

তারপরে আপনি mযাচাই করার শর্ত হিসাবে এটি ব্যবহার করতে পারেন :

>>> m = re.search('\d+', 'aa33bbb44')
>>> if m:
        print('First number found = {}'.format(m.group()))
    else:
        print('Not Found')


First number found = 33

12

আমি সাথে যেতে হবে:

r = re.search("\d+", ch)
result = return r.group(0) if r else ""

re.searchতবে যাইহোক স্ট্রিংয়ে কেবল প্রথম ম্যাচটি সন্ধান করে, তাই আমি মনে করি এটি ব্যবহারের চেয়ে আপনার অভিপ্রায়টি কিছুটা স্পষ্ট করে তোলে findall


7

আপনি মোটেও ব্যবহার .findall()করা উচিত নয় - .search()আপনি যা চান তা হ'ল। এটি বামতমতম মিল খুঁজে পেয়েছে, যা আপনি চান (বা Noneকোনও মিল না থাকলে ফিরে আসে )।

m = re.search(pattern, text)
result = m.group(0) if m else ""

আপনি এটি কোনও ফাংশনে রাখতে চান তা আপনার উপর নির্ভর করে। এটা অস্বাভাবিক কোন মিল খুঁজে পাওয়া যায় একটি খালি স্ট্রিং ফিরে যাওয়ার, যার কারণে যে মত কিছুই সালে নির্মিত হয় চান। এটি অসম্ভব গুলিয়ে ফেলেন! কিনা .search()নিজস্ব খুঁজে বের করে একটি ম্যাচ (এটা ফেরৎ Noneযদি এটা না, অথবা একটি SRE_Matchবস্তু যদি এটা করে)।


3

আপনি করতে পারেন:

x = re.findall('\d+', text)
result = x[0] if len(x) > 0 else ''

মনে রাখবেন যে আপনার প্রশ্নটি রেগেক্সের সাথে সম্পর্কিত নয়। বরং আপনি কীভাবে নিরাপদে কোনও অ্যারের থেকে উপাদান খুঁজে পাবেন, যদি এর কোনও না থাকে।


4
আমি এখানে 'লেন (এক্স)> 0' কে কেবল 'এক্স' দিয়ে প্রতিস্থাপন করব।
উলফ আসলাক

1

বেশি পরিমাণে ইনপুট ডেটা আপনার চাওয়া টুকরা না রাখলে এটি আরও কিছুটা ভাল সম্পাদন করতে পারে কারণ আরও বেশি ব্যয় ব্যতীত।

def return_first_match(text):
    result = re.findall('\d+',text)
    result = result[0] if result else ""
    return result
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.