roimin1
@roimin1

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

複数行の標準入力による正規表現の判定

解決したいこと

python3で標準入力の問題を解いています。
一行目の文字列(標準入力の一行目)が二行目の文字列(標準入力二行目)に含まれていたらNOで含まれていないならOKと出力したいです。
解決方法を教えて下さい。

条件
すべてのテストケースにおいて、以下の条件をみたします。

・1 ≦ 文字列 s_1, s_2 の長さ ≦ 100
・s_1, s_2 は半角アルファベットで構成された文字列

例)

想定する入力1↓
abcf
gabcfk

想定する出力1↓
NO
想定する入力2↓
b
dfzk

想定する出力2↓
OK

発生している問題・エラー

OKとNOが逆転している
もしくはどのパターンも外す。

自分で試したこと

場合を判定するのでif文を使う。
含む含まれないを判定するので、正規表現を使う。
特にre.matchを使う。re.match(危険な文字,判定したい文字列)

import re
s_1=input()#一行目の文字列(標準入力の一行目)でこれが二行目に含まれてるか判定したい
s_2=input()#二行目の文字列(標準入力二行目)で、一行目の文字列があるかを判定したい。
if re.match(s_1,s_2):#第一引数のs_1がs_2に含まれているか判定
    print("OK")
else:
    print("NO")

Noneなどの条件を明確化しないと、場合分けのわけがわからなくなるのでは?と仮定。
下記のif文にNoneを追加することで危険な文字列は無い場合をOKとする。

import re
s_1=input()
s_2=input()
if re.match(s_1,s_2)==None:
    print("OK")
else:
    print("NO")
0

2Answer

今回使われているre.matchは文字列の先頭のみしか見ないことがドキュメントでも示されております.
したがって,文字列中のどこでもマッチさせたいのであればre.searchを使うようにしましょう.

re.searchを使った場合
import re
s_1, s_2 = input(), input()
if re.search(s_1, s_2):
    print("OK")
else:
    print("NO")

また,Pythonの標準機能としてin演算子というものがあります.それを使っても同様に,

in演算子を使った場合
s_1, s_2 = input(), input()
if s_1 in s_2:
    print("OK")
else:
    print("NO")

とするだけで同じ機能を実現させることができます.re.searchの方が,文字列の何番目に一致するものがあったかどうかを調べてくれるので,そちらの方が有用な場合もありますし,今回のように含まれているかどうかの判定だけでいい場合はオーバースペックな場合と考えることもできます.

似たような問題としてAtCoderでは

が挙げられます.
正規表現を学習したい場合ではアルゴ式に正規表現のコースがあるのでやってみると良いと思います.

3Like

こちらでいかがでしょう。

if s_1 in s_2:
    print("NO")
else:
    print("OK")

re.match は先頭からのマッチですので、うまく動きません。

中間も含めるならre.searchを使います。

2Like

Your answer might help someone💌