re: return True ของ python หากสตริงมีรูปแบบ regex


107

ฉันมีนิพจน์ทั่วไปดังนี้:

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

ฟังก์ชั่นจะต้องกลับจริงถ้าคำมีบาร์ , bazหรือไม่ดี ในระยะสั้นฉันต้องการ regexp analog สำหรับ Python's

'any-string' in 'text'

จะรู้ตัวได้อย่างไร ขอบคุณ!


17
เพียงแค่ใช้bool(re.search('ba[rzd]', 'sometext')).
Raymond Hettinger

คำตอบ:


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

1
ฉันกำลังทำงานในกรณีที่คล้ายกันซึ่งฉันต้องการค้นหาสตริงที่แน่นอน ( xyz) และต้องการทราบว่าวิธีใดเป็นวิธีที่มีประสิทธิภาพมากกว่าฉันควรใช้ python 'xyz' in given_textหรือใช้re.compile(r'xyz').search(given_text)?
bawejakunal

1
[]วงเล็บประกอบด้วยชั้นเรียนตัวอักษรเพื่อให้คุณอีกครั้งนอกจากนี้ยังตรงกับ >>> คำ = 'บริติชแอร์เวย์ |'; regexp.search (word) <_sre.SRE_Match วัตถุที่ 0x101030b28> คุณสามารถวางสัญลักษณ์ท่อทั้งหมด
radtek

108

สิ่งที่ดีที่สุดคือ

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

ส่งคืนจริง


2
เหตุใดวิธีนี้จึงดีกว่าโซลูชันอื่น ๆ
kres0345

1
ประการหนึ่งมันจะส่งกลับไฟล์bool. OP: "ต้องส่งคืนTrueหากคำมี bar, baz หรือ bad" คำตอบอื่น ๆ ใช้ลักษณะการทำงานของif- การแปลงนิพจน์ทางขวาเป็น a 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

20

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
ตามที่ผมเข้าใจคำถาม OP จริงต้องการมากกว่าsearch match(ดูdocs.python.org/library/re.html#matching-vs-searching. ) ...นอกจากนี้ผมคิดว่ามันจะเป็นประโยชน์หากคุณแสดงให้เห็นว่าข้อโต้แย้งที่เป็นไปได้ที่เกิดขึ้นจริงในลำดับที่ถูกต้องมากกว่าแค่
ruakh

1
ถ้าคุณเปลี่ยนstไป"foo bar"วิธีการแข่งขันจะไม่ได้ทำงานที่นี่ คุณต้องการค้นหา
bukzor

@ruakh ลิงก์นั้นจะไม่เลื่อนอัตโนมัติไปยังส่วนนั้นของเอกสารอีกต่อไปตอนนี้ลิงก์คือdocs.python.org/2/library/re.html#search-vs-match
freeforall tousez

@RanRag อะไรคือความแตกต่างของความซับซ้อนในการค้นหาสตริงย่อยด้วยinและregex?
Piyush S. Wanare

1

นี่คือฟังก์ชันที่ทำในสิ่งที่คุณต้องการ:

import re

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

วิธีการค้นหานิพจน์ทั่วไปส่งคืนอ็อบเจ็กต์เมื่อสำเร็จและไม่มีหากไม่พบรูปแบบในสตริง ด้วยเหตุนี้เราจึงคืนค่า True ตราบเท่าที่การค้นหาให้บางอย่างกลับมา

ตัวอย่าง:

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