প্রশ্নে উল্লেখিত ৩ টা জিনিসের ব্যাবহার + কিভাবে কাজ করে বুঝতেছি না। আমি এইখান automatetheboringstuff থেকে পড়তেছি। নিজের ভাষায় উদাহারণ সহকারে ব্যাপারগুলা বুঝায় দিলে উপকৃত হবো।

ধন্যবাদ :)

asked 30 Sep, 15:12

_Shaon_'s gravatar image

_Shaon_
580111

edited 30 Sep, 15:15


caret(^) : কোন টেক্সটের একদম শুরুতে কোন কিছু ম্যাচ করার জন্য এটা ব্যাবহার করা হয় । একটা উদাহরণ দেই ।

  begins_with_amar = re.compile(r'^amar')

উপরের লাইন দিয়ে আমি বোঝাচ্ছি যে আমি যে স্ট্রিং এ সার্চ করবও সেটা অবশ্যই amar কথা দিয়ে শুরু হতে হবে । না হলে সার্চ রেজাল্ট None দেখাবে । পরীক্ষা করে দেখি ।

>>> ans = begins_with_amar.search('amar sonar bangla ami tomay valobasi')
>>> print(ans)
<_sre.SRE_Match object; span=(0, 4), match='amar'>
>>> 
>>> ans = begins_with_amar.search('valobasi. amar sonar bangla ami tomay valobasi')
>>> print(ans)
None
>>>

পরের স্ট্রিং টা ভালবাসি দিয়ে শুরু হওয়ার কারণে None প্রিন্ট করছে । অর্থাৎ শুরুতেই কোন কিছু ম্যাচ করার জন্য আমরা ^ ব্যাবহার করতে পারি ।

Dollar Sing ($) : এটা হল ^ এর উল্টাটা । আমি যদি চাই আমার স্ট্রিং টা অবশ্যই একটা বিশেষ কিছু দিয়ে শেষ হবে তাহলে আমরা $ ব্যাবহার করতে পারি । একটা উদাহরণ দেখা যাক ।

>>> ends_with_valobasi = re.compile(r'valobasi$')

উপরের এটা দিয়ে আমরা বলে দিচ্ছি যে আমার যে স্ট্রিং আছ সেটা অবশ্যই valobasi দিয়ে শেষ হতে হবে । যদি valobasi দিয়ে শেষ না হয় তবে None রিটার্ন করবে । পরীক্ষা করে দেখা যাক ।

>>> ans = ends_with_valobasi.search('amar sonar banla ami tomay valobasi')
>>> print(ans)
<_sre.SRE_Match object; span=(27, 35), match='valobasi'>
>>> ans = ends_with_valobasi.search('amar sonar banla ami tomay valobasi chirodin tomar akas')
>>> print(ans)
None
>>>

পরের স্ট্রিং টি valobasi দিয়ে শেষ হয় নি তাই None প্রিন্ট করেছে ।

Wildcard (.): ডট নিউলাইন ছাড়া সব ক্যারেক্টারকেই কভার করতে পারে । অর্থাৎ আমি যদি লিখি re.compile(r'.txt') তাহলে সে সবগুলো txt কে বের করবে + ডট(.) এর জায়গায় যেকোনো ক্যারেক্টার হতে পারবে । উদাহরণ দেখা যাক ।

>>> dot_regex = re.compile(r'.txt')
>>>
>>> ans = dot_regex.search('abctxt efgtxt hij klmnop qrstuvwtxt')
>>> print(ans)
<_sre.SRE_Match object; span=(2, 6), match='ctxt'>
>>>
>>> ans = dot_regex.findall(('abctxt efgtxt hij klmnop qrstuvwtxt'))
>>> print(ans)
['ctxt', 'gtxt', 'wtxt']
>>>
>>> ans = dot_regex.findall(('abctxt efgtxt hij klmnop qrstuvwtxtklm'))
>>> print(ans)
['ctxt', 'gtxt', 'wtxt']
>>>

এখানে আমরা দেখতে পাচ্ছি যে সে যে যে জায়গায় txt পেয়েছে সেই txt সহ ডট(.) এর জায়গায় যে ক্যারেক্টার ছিল সেটা সহ ম্যাচ রিটার্ন করছে ।

Edit - 1 : ডট নিউলাইন ছাড়া সব ক্যারেক্টারকেই কভার করতে পারে এই উদাহরণ লক্ষ করেন । \n কে কভার করতে পারে নি ।

>>> text = 'amar sonar \nbangla'
>>> new_line_regex = re.compile(r'.ban')
>>> new_line_regex.search(text)
>>> ans = new_line_regex.search(text)
>>> print(ans)
None
>>>

Edit - 2: শুরু হবে নাম্বার দিয়ে এবং শেষও হবে নাম্বার দিয়ে কিন্তু মাঝে কি থাকবে ঐটা চেক করার প্রয়োজন নাই

এই কাজটা অনেক ভাবেই করা যেতে পারে । আমি নিচে একটা দেখাচ্ছি ।

>>> w_regex = re.compile(r'\d+\w+\d+$')
>>>
>>> ans = w_regex.search('10fafa10ad9')
>>> ans
<_sre.SRE_Match object; span=(0, 11), match='10fafa10ad9'>
>>> 
>>> ans = w_regex.search('10fafad')
>>> print(ans)
None
>>> print(w_regex.search('ffadfa10'))
None
>>>

ধন্যবাদ :)

permanent link

answered 30 Sep, 18:35

menon's gravatar image

menon
3.6k220

edited 01 Oct, 16:34

তাহলে আমরা caret sign (^) এর বিকল্প হিসাবে startswith() ফাংশন এবং dollar sign ($) এর বিকল্প হিসাবে endswith() ফাংশন ইউজ করতে পারি। এখানে পার্থক্য শুধু রিটার্ন ভ্যালু তে। কিন্তু কাজ একি।

আর wildcard character (.) এর ব্যাপার হচ্ছে, dot এর পরিবর্তে সে যেকোন একটা ক্যারেক্টার নিতে পারবে হোক ডিজিট বা কোন স্পেশাল ক্যারেক্টার। কিন্তু '''ডট নিউলাইন ছাড়া সব ক্যারেক্টারকেই কভার করতে পারে''' এই কথাটার মানে বুঝি নাই।

(01 Oct, 14:59) _Shaon_

আরেকটা ব্যাপার,

wholeStringIsNum = re.compile(r'^\d+$')

এইখানে তো চেক করা হচ্ছে, সম্পূর্ন স্ট্রিং নাম্বার কিনা। যদি আমি এমন চাই যে স্ট্রিং শুরু হবে নাম্বার দিয়ে এবং শেষও হবে নাম্বার দিয়ে কিন্তু মাঝে কি থাকবে ঐটা চেক করার প্রয়োজন নাই তাহলে ঐ লাইনটা আপনি কিভাবে ইডিট করবেন? নাকি এর জন্য ২ টা আলাদা অবজেক্ট ক্রিয়েট করতে হবে?

(01 Oct, 15:12) _Shaon_
1

re দিয়ে যে কাজ করা যায় সেগুলো আপনি ইচ্ছা করলে নিজে কোড লিখেও করতে পারেন । কিন্তু তাতে করে কোড অনেক বড় হবে এবং জটিলতাও অনেক বেরে যাবে । আর re দিয়ে আপনি কাজটি এক লাইনেই করতে পারছেন । @Shaon

(01 Oct, 16:37) menon
1

উত্তর আপডেট করে দিলাম @Shaon

(01 Oct, 16:38) menon
Your answer
toggle preview

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or _italic_
  • **bold** or __bold__
  • link:[text](http://url.com/ "title")
  • image?![alt text](/path/img.jpg "title")
  • numbered list: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Question tags:

×59
×3
×1
×1
×1

question asked: 30 Sep, 15:12

question was seen: 67 times

last updated: 01 Oct, 16:38