अजगर की फिर से वापसी: यह सच है अगर स्ट्रिंग में रेगेक्स पैटर्न है


98

मेरी इस तरह एक नियमित अभिव्यक्ति है:

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

फ़ंक्शन सही होना चाहिए यदि शब्द में बार , बाज या ख़राब है । संक्षेप में, मुझे पायथन के लिए regexp एनालॉग की आवश्यकता है

'any-string' in 'text'

मैं इसे कैसे महसूस कर सकता हूं? धन्यवाद!


17
बस उपयोग करें bool(re.search('ba[rzd]', 'sometext'))
रेमंड हेटिंगर

जवाबों:


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

1
मैं एक ऐसे ही मामले पर काम कर रहा हूं, जहां मैं एक सटीक स्ट्रिंग ( xyz) की खोज करना चाहता हूं और यह जानना चाहता हूं कि ऐसा करने का अधिक कुशल तरीका क्या है, क्या मुझे अजगर का उपयोग करना चाहिए 'xyz' in given_textया उपयोग करना चाहिए re.compile(r'xyz').search(given_text)?
बावेजकुनाल

1
[]कोष्ठक, एक चरित्र क्लास तो अपने फिर से भी मेल खाता है: >>> शब्द = 'बा |'; regexp.search (शब्द) <_sre.SRE_Match ऑब्जेक्ट 0x101030b28> पर। आप सभी पाइप प्रतीकों को छोड़ सकते हैं।
राडटेक

104

अब तक का सबसे अच्छा है

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

सच्चा लौटाता है


2
यह अन्य समाधानों से बेहतर क्यों है?
kres0345

1
एक बात के लिए, यह एक रिटर्न 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

15

Matchऑब्जेक्ट हमेशा सत्य होते हैं, और Noneयदि कोई मिलान नहीं है, तो उसे लौटा दिया जाता है। सिर्फ ट्रूनेस के लिए टेस्ट करें।

कोड:

>>> 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

जैसा कि @bukzor ने उल्लेख किया है कि अगर st = foo barthan match काम नहीं करेगा। तो, इसका उपयोग करने के लिए अधिक उपयुक्त है re.search


1
जैसा कि मैं इस प्रश्न को समझता हूं, ओपी वास्तव में searchइसके बजाय चाहता है match। (देखें docs.python.org/library/re.html#matching-vs-searching। ) इसके अलावा, मुझे लगता है कि यह मददगार होगा यदि आप वास्तविक संभावित तर्कों को सही क्रम में दिखाते हैं, बजाय केवल ...
बरबाद

1
यदि आप बदल stजाते हैं "foo bar", तो मैच विधि यहां काम नहीं करेगी। तुम खोज चाहते हो।
बोजोर

@ruakh जो लिंक अब ऑटो स्क्रॉल को डॉक्टर के उस हिस्से तक नहीं पहुंचाता है, अब लिंक docs.python.org/2/library/re.html#search-vs-match
freeforall tousez

@RRRag किस विकल्प के साथ inऔर खोजने में जटिलता अंतर है regex?
पीयूष एस। वानारे

1

यहाँ एक फ़ंक्शन है जो आप चाहते हैं:

import re

def is_match(regex, text):
    pattern = re.compile(regex, text)
    return pattern.search(text) is not 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.