একটি নিয়মিত ভাবের ভিতরে ভেরিয়েবল কীভাবে ব্যবহার করবেন?


235

আমি একটি এর variableঅভ্যন্তর ব্যবহার করতে চাই regex, আমি এটি কীভাবে করব Python?

TEXTO = sys.argv[1]

if re.search(r"\b(?=\w)TEXTO\b(?!\w)", subject, re.IGNORECASE):
    # Successful match
else:
    # Match attempt failed

9
আপনি স্ট্রিং কনটেনটেশন ব্যবহার করেন
ক্রিস এবারেল

উত্তর:


52

পাইথন ৩.6 থেকে আপনি ল্যাটারাল স্ট্রিং ইন্টারপোলেশন , "এফ-স্ট্রিংস" ব্যবহার করতে পারেন । আপনার বিশেষ ক্ষেত্রে সমাধানটি হ'ল:

if re.search(rf"\b(?=\w){TEXTO}\b(?!\w)", subject, re.IGNORECASE):
    ...do something

সম্পাদনা করুন:

যেহেতু বিশেষ চরিত্রগুলি কীভাবে মোকাবেলা করতে হবে সে সম্পর্কে মন্তব্যে কিছু প্রশ্ন রয়েছে আমি আমার উত্তরটি প্রসারিত করতে চাই:

কাঁচা স্ট্রিং ('আর'):

নিয়মিত অভিব্যক্তিগুলিতে বিশেষ অক্ষরের সাথে আচরণ করার সময় আপনাকে যে মুখ্য ধারণাগুলি বুঝতে হবে তা হ'ল স্ট্রিং লিটারাল এবং নিয়মিত প্রকাশের মধ্যেই পার্থক্য। এটি এখানে খুব ভালভাবে ব্যাখ্যা করা হয়েছে :

সংক্ষেপে:

এর পরিবর্তে একটি শব্দ সীমানা খুঁজে বের করার বলতে দাও \bপর TEXTOআপনি STRING মেলে চান \boundary। আপনি লিখতে হবে:

TEXTO = "Var"
subject = r"Var\boundary"

if re.search(rf"\b(?=\w){TEXTO}\\boundary(?!\w)", subject, re.IGNORECASE):
    print("match")

এটি কেবলমাত্র কাজ করে কারণ আমরা একটি কাঁচা-স্ট্রিং ব্যবহার করছি (রেজেক্সটি 'r' এর আগে রয়েছে), অন্যথায় আমাদের অবশ্যই রেজেক্সে "\\\\ সীমানা" লিখতে হবে (চারটি ব্যাকস্ল্যাশ)। তদ্ব্যতীত, '' r 'ব্যতীত, \ বি' শব্দের সীমানায় আর একটি ব্যাকস্পেসে রূপান্তরিত হবে না!

পুনরায় পরীক্ষা :

মূলত কোনও বিশেষ চরিত্রের সামনে একটি ব্যাকস্পেস রাখে। অতএব, আপনি যদি টেক্সটোতে একটি বিশেষ চরিত্রের প্রত্যাশা করেন, আপনাকে লিখতে হবে:

if re.search(rf"\b(?=\w){re.escape(TEXTO)}\b(?!\w)", subject, re.IGNORECASE):
    print("match")

দ্রষ্টব্য: যেকোনো সংস্করণের জন্য> = পাইথন 3.7: !, ", %, ', ,, /, :, ;, <, =, >, @, এবং `পলান নয়। শুধুমাত্র একটি রেজেক্সে অর্থ সহ বিশেষ অক্ষরগুলি এখনও অব্যাহতিপ্রাপ্ত। _পাইথন ৩.৩ থেকে পলায়ন করা হয়নি ( এখানে )

কোঁকড়া ধনুর্বন্ধনী:

আপনি যদি এফ-স্ট্রিংগুলি ব্যবহার করে নিয়মিত প্রকাশের মধ্যে কোয়ান্টিফায়ার ব্যবহার করতে চান তবে আপনাকে ডাবল কোঁকড়া ধনুর্বন্ধনী ব্যবহার করতে হবে। ধরা যাক আপনি 2 টি সংখ্যার পরে টেক্সটওটি মিলাতে চান:

if re.search(rf"\b(?=\w){re.escape(TEXTO)}\d{{2}}\b(?!\w)", subject, re.IGNORECASE):
    print("match")

2
2020 সালের হিসাবে, এটি একটি নিয়মিত অভিব্যক্তির ভিতরে পরিবর্তনশীলটি ব্যবহার করার সবচেয়ে সহজ এবং অজগর উপায়
CONvid19

3
এটি অবশ্যই একটি বাহ !
জেসন গোল

2
এখানে কেউ "আরএফ" এর তাত্পর্য ব্যাখ্যা করতে পারে
হর্ষ রেড্ডি

1
@ হর্ষাডেডি: 'আর': এই স্ট্রিংটি একটি কাঁচা স্ট্রিং: আপনি যদি এটি ব্যবহার না করেন তবে '\ বি' ব্যাকস্পেস অক্ষরে রূপান্তরিত হবে ( ডকস.পিথন.আর / 3 / হাওটো / রেজিএক্স.এইচটিএমএল#more- প্যাটার্ন-শক্তি )। 'f' পাইথনকে বলে যে এটি একটি 'এফ-স্ট্রিং', এস। উপরের লিঙ্কটি, এবং আপনাকে কোঁকড়া ধনুর্বন্ধনী
বায়ুবাহিত

2
কিভাবে F-স্ট্রিং মধ্যে quantifiers লিখতে: fr"foo{{1,5}}"(ধনুর্বন্ধনী ডবল)
PunchyRascal

281

আপনাকে একটি স্ট্রিং হিসাবে রেজেক্স তৈরি করতে হবে:

TEXTO = sys.argv[1]
my_regex = r"\b(?=\w)" + re.escape(TEXTO) + r"\b(?!\w)"

if re.search(my_regex, subject, re.IGNORECASE):
    etc.

এর ব্যবহারটি নোট করুন re.escapeযাতে আপনার পাঠ্যে যদি বিশেষ অক্ষর থাকে তবে সেগুলি এর মতো ব্যাখ্যা করা হবে না।


4
যদি আপনার ভেরিয়েবলটি আগে যায়? r'' + foo + 'bar'?
deed02392

@ ডিড02392 r''যদি আপনি করেন তবে এটি প্রয়োজনীয় নয় re.escape(foo), যা আপনার যাই হোক না কেন। প্রকৃতপক্ষে, আমি মনে করি reএটি ইউনিকোড স্ট্রিং হিসাবে যা দেওয়া হয়েছে তা আপনার উপসর্গ কিনা তা নির্বিশেষে ব্যাখ্যা করে r
ওজেফোর্ড

। Formc () কি re.escape এর জায়গায় পাশাপাশি কাজ করে বা re.escape () প্রয়োজনীয়?
প্রেক্সাইটেলস

আপনি কি উত্তর খুঁজে পেয়েছেন?
CONvid19

2
আমি নিশ্চিত না যে এটিতে আমার কাজ করে কিনা এমন একটি গ্রুপ থাকা দরকার যা ভেরিয়েবলের একটি অংশ। নীচের অন্যান্য উত্তরগুলি এর জন্য আরও স্বজ্ঞাত দেখাচ্ছে এবং বেশ কয়েকটি অভিব্যক্তিতে রেজেক্সকে ভাঙ্গবে না।
গিভাল

48
if re.search(r"\b(?<=\w)%s\b(?!\w)" % TEXTO, subject, re.IGNORECASE):

এটি টেক্সটওতে যা আছে তা স্ট্রিং হিসাবে রেজেক্সে প্রবেশ করবে।



6

আমি একাধিক ছোট নিদর্শন একসাথে স্ট্রিং করে একটি নিয়মিত প্রকাশের প্যাটার্ন তৈরি করা খুব সুবিধাজনক বলে মনে করি।

import re

string = "begin:id1:tag:middl:id2:tag:id3:end"
re_str1 = r'(?<=(\S{5})):'
re_str2 = r'(id\d+):(?=tag:)'
re_pattern = re.compile(re_str1 + re_str2)
match = re_pattern.findall(string)
print(match)

আউটপুট:

[('begin', 'id1'), ('middl', 'id2')]

4

আমি উপরোক্ত সকলের সাথে একমত না হলে:

sys.argv[1] কিছু ছিল Chicken\d{2}-\d{2}An\s*important\s*anchor

sys.argv[1] = "Chicken\d{2}-\d{2}An\s*important\s*anchor"

আপনি ব্যবহার করতে চাইবেন না re.escape, কারণ সেই ক্ষেত্রে আপনি এটি একটি রেজেক্সের মতো আচরণ করতে চান

TEXTO = sys.argv[1]

if re.search(r"\b(?<=\w)" + TEXTO + "\b(?!\w)", subject, re.IGNORECASE):
    # Successful match
else:
    # Match attempt failed

2

একে অপরের সাথে সাদৃশ্যপূর্ণ ব্যবহারকারী নামগুলি অনুসন্ধান করার দরকার ছিল এবং নেড ব্যাচেল্ডার যা বলেছেন তা অবিশ্বাস্যরূপে সহায়ক ছিল। যাইহোক, আমি আমার ক্লিয়ার আউটপুট পেয়েছি যখন আমি আমার পুনরায় অনুসন্ধানের শব্দটি তৈরি করতে re.compile ব্যবহার করেছি:

pattern = re.compile(r"("+username+".*):(.*?):(.*?):(.*?):(.*)"
matches = re.findall(pattern, lines)

নিম্নলিখিত ব্যবহার করে আউটপুট মুদ্রণ করা যেতে পারে:

print(matches[1]) # prints one whole matching line (in this case, the first line)
print(matches[1][3]) # prints the fourth character group (established with the parentheses in the regex statement) of the first line.

1

আপনি formatব্যাকরণ সুগার ব্যবহার করে অন্য ব্যবহারের চেষ্টা করতে পারেন :

re_genre = r'{}'.format(your_variable)
regex_pattern = re.compile(re_genre)  

0

আপনি এটির জন্য ফর্ম্যাট কীওয়ার্ডও ব্যবহার করতে পারেন For ফর্ম্যাট পদ্ধতিটি আপনি আর্গুমেন্ট হিসাবে ফর্ম্যাট পদ্ধতিতে পাস করেছেন এমন ভেরিয়েবলটিতে}} স্থানধারককে প্রতিস্থাপন করবে।

if re.search(r"\b(?=\w)**{}**\b(?!\w)".**format(TEXTO)**, subject, re.IGNORECASE):
    # Successful match**strong text**
else:
    # Match attempt failed

0

আরও উদাহরণ

আমার কাছে প্রবাহের ফাইলগুলির সাথে কনফিগারেশন.আইএমএল রয়েছে

"pattern":
  - _(\d{14})_
"datetime_string":
  - "%m%d%Y%H%M%f"

পাইথন কোডে আমি ব্যবহার করি

data_time_real_file=re.findall(r""+flows[flow]["pattern"][0]+"", latest_file)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.