অজগরটির পুনরায়: সত্যায় ফিরে আসুন যদি স্ট্রিংটিতে রেজেক্স প্যাটার্ন থাকে


104

আমার নিয়মিত মত প্রকাশ হয়:

regexp = u'ba[r|z|d]'

শব্দের মধ্যে বার , বাজ বা খারাপ থাকলে ফাংশনটি অবশ্যই সত্যটি ফিরে আসে । সংক্ষেপে, পাইথনের জন্য আমার রেজিপ্লেক্স অ্যানালগ প্রয়োজন

'any-string' in 'text'

আমি কীভাবে এটি উপলব্ধি করতে পারি? ধন্যবাদ!


17
শুধু ব্যবহার bool(re.search('ba[rzd]', 'sometext'))
রেমন্ড হেটেঙ্গার

উত্তর:


159
import re
word = 'fubar'
regexp = re.compile(r'ba[rzd]')
if regexp.search(word):
  print 'matched'

4
আমি একটি অনুরূপ ক্ষেত্রে কাজ করছি যেখানে আমি সঠিক স্ট্রিং ( xyz) অনুসন্ধান করতে চাই এবং এটি করার জন্য আরও কার্যকর উপায় কোনটি জানতে চাই, আমি কি পাইথন ব্যবহার করব 'xyz' in given_textবা ব্যবহার করব re.compile(r'xyz').search(given_text)?
বাওজাকুনাল

4
[]বন্ধনী, একটি অক্ষর ক্লাস রাখতে তাই আপনার পুনরায় এছাড়াও সাথে মেলে: >>> শব্দ = 'বিএ |'; regexp.search (শব্দ) <_sre.SRE_ মিল অবজেক্ট 0x101030b28>। আপনি সমস্ত পাইপ প্রতীক ফেলে দিতে পারেন।
র‌্যাডটেক

106

এখন পর্যন্ত সেরা এক

bool(re.search('ba[rzd]', 'foobarrrr'))

সত্য ফিরে আসে


4
এটি কেন অন্য সমাধানগুলির চেয়ে ভাল?
kres0345

4
একটি জিনিস জন্য, এটি একটি bool। ওপি: " Trueযদি শব্দটিতে বার, বাজ বা খারাপ থাকে তবে অবশ্যই ফিরে আসতে হবে ।" অন্যান্য উত্তরগুলি এর ব্যবহার ব্যবহার করে if- ভাবটিকে স্বয়ংক্রিয়ভাবে রূপান্তরিত করে এটিকে ডান দিকে রূপান্তর করে bool। যেমন import re; rgx=re.compile(r'ba[rzd]'); rgx.search('foobar')=> <re.Match object; span=(2, 5), match='bar'>, তবে if(rgx.search(w)): print('y')=> yস্বতঃ-রূপান্তরকরণের নথিপত্রের সবচেয়ে কাছাকাছি আমি সন্ধান করতে পারি ( সংরক্ষণাগারভুক্ত )
bballdave025

18

Matchবস্তু সর্বদা সত্য, এবং Noneকোনও মিল না থাকলে ফিরে আসে returned শুধু সত্যতার জন্য পরীক্ষা।

কোড:

>>> st = 'bar'
>>> m = re.match(r"ba[r|z|d]",st)
>>> if m:
...     m.group(0)
...
'bar'

আউটপুট = bar

আপনি যদি searchকার্যকারিতা চান

>>> st = "bar"
>>> m = re.search(r"ba[r|z|d]",st)
>>> if m is not None:
...     m.group(0)
...
'bar'

আর যদি regexpনা পাওয়া যায়

>>> st = "hello"
>>> m = re.search(r"ba[r|z|d]",st)
>>> if m:
...     m.group(0)
... else:
...   print "no match"
...
no match

যেমন @ বুকজোর উল্লেখ করেছেন যে st = এর foo barচেয়ে বেশি মিল কাজ করবে না। সুতরাং, এটি ব্যবহার করার জন্য আরও উপযুক্ত re.search


4
আমি যেমন প্রশ্নটি বুঝতে পারি, ওপি আসলে searchতার চেয়ে বরং চায় match। ( ডকস.পিথন.আর.আলিবেরি / রে। এইচটিএমএল#matching-vs-searching দেখুন )) এছাড়াও, আমি মনে করি যে আপনি যদি যুক্তি না দিয়ে সঠিক ক্রমে প্রকৃত সম্ভাব্য যুক্তি প্রদর্শন করেন তবে এটি সহায়ক হবে ...
রুখ

4
আপনি যদি পরিবর্তন stকরেন "foo bar"তবে ম্যাচ পদ্ধতিটি এখানে কাজ করবে না। আপনি অনুসন্ধান চান।
বুকজর

@রুখ সেই লিঙ্কটি এখন আর ডক্সের সেই অংশে স্বয়ংক্রিয়ভাবে স্ক্রোল করবে না, এখন লিঙ্কটি হ'ল ডকস.পাইথন.আর.
html#

@RanRag সঙ্গে সাবস্ট্রিং অনুসন্ধানের মধ্যে জটিলতা পার্থক্য কি inএবং regex?
পীযূষ এস ওয়ানারে

1

এখানে একটি ফাংশন যা আপনি যা চান তা করে:

import re

def is_match(regex, text):
    pattern = re.compile(regex, text)
    return pattern.search(text) is not None

নিয়মিত অভিব্যক্তি অনুসন্ধানের পদ্ধতিটি সাফল্যের উপর একটি বস্তু ফেরত দেয় এবং স্ট্রিংটিতে প্যাটার্নটি খুঁজে পাওয়া যায় না None এটি মাথায় রেখে আমরা ততক্ষণ সত্য ফিরে আসি যতক্ষণ অনুসন্ধান আমাদের কিছু ফিরিয়ে দেয়।

উদাহরণ:

>>> is_match('ba[rzd]', 'foobar')
True
>>> is_match('ba[zrd]', 'foobaz')
True
>>> is_match('ba[zrd]', 'foobad')
True
>>> is_match('ba[zrd]', 'foobam')
False

0

আপনি এর মতো কিছু করতে পারেন:

অনুসন্ধানটি ব্যবহার করে কোনও SRE_match অবজেক্ট ফিরে আসবে, যদি এটি আপনার অনুসন্ধানের সাথে মেলে।

>>> import re
>>> m = re.search(u'ba[r|z|d]', 'bar')
>>> m
<_sre.SRE_Match object at 0x02027288>
>>> m.group()
'bar'
>>> n = re.search(u'ba[r|z|d]', 'bas')
>>> n.group()

যদি তা না হয় তবে তা কিছুই ফেরত আসবে না

Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module>
    n.group()
AttributeError: 'NoneType' object has no attribute 'group'

এবং এটি আবার প্রদর্শন করতে মুদ্রণ করতে:

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