pythonのre:文字列に正規表現パターンが含まれている場合はTrueを返します


97

私はこのような正規表現を持っています:

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

単語にbarbazbadが含まれている場合、関数はTrueを返す必要があります。つまり、Pythonの正規表現アナログが必要です。

'any-string' in 'text'

どうすればそれを実現できますか?ありがとう!


17
だけを使用してくださいbool(re.search('ba[rzd]', 'sometext'))
レイモンドヘッティンガー2012年

回答:


151
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)
bawejakunal

1
[]あなたの再にも一致するようにブラケットは、文字クラスが含まれています>>>ワード=「BA |」; regexp.search(word)<_sre.SRE_Match object at 0x101030b28>。すべてのパイプ記号を削除できます。
radtek、2017年

104

これまでで最高のものは

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

Trueを返します


2
なぜこれが他のソリューションよりも優れているのですか?
kres0345

1
1つには、を返しますbool。OP:「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
私が質問を理解しているように、OPは実際にはを望んsearchでいませんmatch。(docs.python.org/library/re.html#matching-vs-searchingを参照してください)また、単にではなく、実際の可能な引数を正しい順序で示した方がよいと思います...
ruakh

1
に変更stする"foo bar"と、matchメソッドはここでは機能しません。検索したい。
bukzor

@ruakhリンクはドキュメントのその部分に自動スクロールしなくなりました。リンクはdocs.python.org/2/library/re.html#search-vs-match
freeforall tousez

@RanRag inandで部分文字列を検索する際の複雑さの違いは何regexですか?
Piyush S. Wanare 2017年

1

ここにあなたが望むことをする関数があります:

import re

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

正規表現検索メソッドは、成功するとオブジェクトを返し、パターンが文字列で見つからない場合は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()

そうでない場合は、Noneを返します

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.