পাইথন রেজেক্স - ম্যাচের অবস্থান এবং মানগুলি কীভাবে পাবেন


112

আমি reমডিউলটি ব্যবহার করে সমস্ত ম্যাচের শুরু এবং শেষ অবস্থানগুলি কীভাবে পেতে পারি ? উদাহরণস্বরূপ প্যাটার্ন r'[a-z]'এবং স্ট্রিং দেওয়া 'a1b2c3d4'আমি যে অবস্থানগুলিতে এটি প্রতিটি অক্ষর খুঁজে পাই সেখানে পেতে চাই। আদর্শভাবে, আমি ম্যাচের পাঠ্যটিও ফিরে পেতে চাই।


উত্তর:


140
import re
p = re.compile("[a-z]")
for m in p.finditer('a1b2c3d4'):
    print(m.start(), m.group())

3
এটি ম্যাচের regex = r '([অ্যাজ]) (0-9)' মি.-স্টার্টটি অন্য গ্রুপের সূচি সরবরাহ করে না, গ্রুপ () নয়, গ্রুপ (1)
স্টিভেন ওয়ার্নারসিএস

@ স্টিভেন ওয়ার্নার সিএসএস start()একটি গ্রুপ নম্বর গ্রহণ করতে পারে, তাই আপনি যদি নবম দলের একটি সূচি চান, ব্যবহার করুনstart(n)
হাই-অ্যাঞ্জেল


51

থেকে নেওয়া

নিয়মিত এক্সপ্রেশন হাওটো

স্প্যান () উভয় প্রারম্ভিক এবং শেষ সূচকগুলি একটি একক টুপলে দেয়। যেহেতু ম্যাচ পদ্ধতিটি কেবল স্ট্রিংয়ের শুরুতে আর আর ম্যাচ করে তা পরীক্ষা করে, শুরু () সর্বদা শূন্য হবে। যাইহোক, রেজেক্সঅবজেক্টের অনুসন্ধানের পদ্ধতিটি স্ট্রিংয়ের মাধ্যমে স্ক্যান করে, সুতরাং সেই ক্ষেত্রে ম্যাচটি শূন্য থেকে শুরু নাও হতে পারে।

>>> p = re.compile('[a-z]+')
>>> print p.match('::: message')
None
>>> m = p.search('::: message') ; print m
<re.MatchObject instance at 80c9650>
>>> m.group()
'message'
>>> m.span()
(4, 11)

এর সাথে একত্রিত করুন:

পাইথন ২.২-তে, সন্ধানকারী () পদ্ধতিটিও উপলব্ধ, ম্যাচবজেক্ট উদাহরণগুলির ক্রম পুনরাবৃত্তকারী হিসাবে ফিরে আসে returning

>>> p = re.compile( ... )
>>> iterator = p.finditer('12 drummers drumming, 11 ... 10 ...')
>>> iterator
<callable-iterator object at 0x401833ac>
>>> for match in iterator:
...     print match.span()
...
(0, 2)
(22, 24)
(29, 31)

আপনার আদেশক্রমে কিছু করতে সক্ষম হওয়া উচিত

for match in re.finditer(r'[a-z]', 'a1b2c3d4'):
   print match.span()

তোমার মত এটি ব্যবহার করতে পারেন re.search(r'abbit', "has abbit of carrot").span(0)-(4, 9)
Константин Ван

span()পাইটিথনের স্লাইস নোটেশনে 'শেষ সূচক' প্রত্যাবর্তনটি রয়েছে যে এটি উপরে যায় তবে সেই সূচকে অন্তর্ভুক্ত করে না; দেখতে এখানে
ওয়েইন

20

পাইথন ৩.x এর জন্য

from re import finditer
for match in finditer("pattern", "string"):
    print(match.span(), match.group())

\nস্ট্রিংয়ের প্রতিটি হিটের জন্য আপনি আলাদা ম্যাচগুলি (যথাক্রমে ম্যাচের প্রথম এবং শেষ সূচকগুলি সমন্বিত) এবং ম্যাচটি নিজেই পাবেন।


2

নোট করুন যে স্প্যান এবং গোষ্ঠীগুলি একটি রেজিজেটে মাল্টি ক্যাপচার গ্রুপগুলির জন্য সূচিযুক্ত

regex_with_3_groups=r"([a-z])([0-9]+)([A-Z])"
for match in re.finditer(regex_with_3_groups, string):
    for idx in range(0, 4):
        print(match.span(idx), match.group(idx))

1
ধন্যবাদ, এটি অত্যন্ত কার্যকর প্রমাণিত হয়েছে এবং এটি বেশ সমাহিত বলে মনে হচ্ছে। এছাড়াও, যদি কারও এটির প্রয়োজন হয়: নামকৃত ক্যাপচার গ্রুপগুলি ব্যবহার করার সময়, <match> .re.groupindex ব্যবহার করে একটি গোষ্ঠীর সূচি খুঁজে পেতে পারে এবং সেখান থেকে আপনার বর্ণিত পদ্ধতির সাথে সম্পর্কিত স্প্যানটি খুঁজে পেতে পারেন
ম্যাডিমভ

কোথায় 4থেকে এসেছে?
রেডিও নিয়ন্ত্রিত

@ রেডিও কন্ট্রোলড নম্বর_মুখে_ অজ্ঞাত_গোষ্ঠী_ইন_রেজেক্স + ১, পরিসীমাটি [শুরু, শেষ) একচেটিয়া হিসাবে শেষ
স্টিভেন ওয়ার্নার সিএসএস

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