文字列に特定の文字がないか確認するにはどうすればよいですか?[閉まっている]


182

Python 2を使用して、文字列にいくつかの特定の文字が含まれているかどうかを確認するにはどうすればよいですか?

たとえば、次の文字列があるとします。

犯罪者は宝石で1,000,000ドルを盗みました。

ドル記号( "$")、コンマ( "、")、および数値があるかどうかをどのように検出しますか?


1
それは、すべての文字がこれらの1つであることになっているということですか、それともこれらの文字の1つ(またはすべて)が文字列に存在することで十分ですか?それらが有効であるためには、それらは何らかの順序(例:$ 2,00)である必要がありますか?
NullUserException

2
ちょうど別の種類のアプローチと同様にnot set(p).isdisjoint(set("0123456789$,"))pテストする文字列はどこにありますか。
ケビン

回答:


265

あなたの文字列がs次のようであると仮定します:

'$' in s        # found
'$' not in s    # not found

# original answer given, but less Pythonic than the above...
s.find('$')==-1 # not found
s.find('$')!=-1 # found

他のキャラクターについても同様です。

...または

pattern = re.compile(r'\d\$,')
if pattern.findall(s):
    print('Found')
else
    print('Not found')

...または

chars = set('0123456789$,')
if any((c in chars) for c in s):
    print('Found')
else:
    print('Not Found')

[編集:'$' in s回答を追加]


20
s.find('$')!=-1=> '$' in s:-)
Jochen Ritzel

not foundの値が0ではなく-1に保たれた理由は何ですか?
akki 14

2
0は文字列の最初の文字のインデックスなので、@ akki not foundは-1です。したがって、「abc」.find( 'a')= 0です。0も見つからない値である場合、あいまいになります。
レミアント14

1
私はを使用した最後のバージョンが好きですany()。見つかった文字cをpythonicスタイルで参照する方法はありany()ますか?
Jens

3
2番目の例は壊れています:正規表現は角かっこを必要とするr'[\d\$,]'ため、これらの文字のいずれかに一致else:し、末尾にコロンがありません。
bjnord 2017年

23

ユーザーJochen Ritzelは、ユーザーdappawitからのこの質問に対する回答へのコメントでこれを述べました。それはうまくいくはずです:

('1' in var) and ('2' in var) and ('3' in var) ...

「1」、「2」などは、探している文字に置き換える必要があります。

文字列に関するいくつかの情報については、Python 2.7ドキュメントのこのページを参照してください。inサブストリングテストでの演算子の。

更新:これは、上記の提案と同じ働きをしますが、繰り返しは少なくなります。

# When looking for single characters, this checks for any of the characters...
# ...since strings are collections of characters
any(i in '<string>' for i in '123')
# any(i in 'a' for i in '123') -> False
# any(i in 'b3' for i in '123') -> True

# And when looking for subsrings
any(i in '<string>' for i in ('11','22','33'))
# any(i in 'hello' for i in ('18','36','613')) -> False
# any(i in '613 mitzvahs' for i in ('18','36','613')) ->True

+1これは、複数の.find()よりもコンパクトで、検索される文字数が少ない限り問題ありません。ただし、括弧は必要ありません。
Sean

1
@Sean括弧について:私は知っていますが、常に優先順位を覚えるよりも、常にそれらを使用する方が簡単です:-)。
アッバフェイ2013

11

Abbafeiによる投稿に応じたタイミングの簡単な比較:

import timeit

def func1():
    phrase = 'Lucky Dog'
    return any(i in 'LD' for i in phrase)

def func2():
    phrase = 'Lucky Dog'
    if ('L' in phrase) or ('D' in phrase):
        return True
    else:
        return False

if __name__ == '__main__': 
    func1_time = timeit.timeit(func1, number=100000)
    func2_time = timeit.timeit(func2, number=100000)
    print('Func1 Time: {0}\nFunc2 Time: {1}'.format(func1_time, func2_time))

出力:

Func1 Time: 0.0737484362111
Func2 Time: 0.0125144964371

したがって、コードはanyの方がコンパクトですが、条件付きの方が高速です。


編集: TL; DR-長い文字列の場合、if-thenはまだ他よりもはるかに高速です!

コメントで指摘されたいくつかの有効なポイントに基づいて、長いランダム文字列のタイミングを比較することにしました。

# Tested in Python 2.7.14

import timeit
from string import ascii_letters
from random import choice

def create_random_string(length=1000):
    random_list = [choice(ascii_letters) for x in range(length)]
    return ''.join(random_list)

def function_using_any(phrase):
    return any(i in 'LD' for i in phrase)

def function_using_if_then(phrase):
    if ('L' in phrase) or ('D' in phrase):
        return True
    else:
        return False

if __name__ == '__main__':
    random_string = create_random_string(length=2000)
    func1_time = timeit.timeit(stmt="function_using_any(random_string)",
                               setup="from __main__ import function_using_any, random_string",
                               number=200000)
    func2_time = timeit.timeit(stmt="function_using_if_then(random_string)",
                               setup="from __main__ import function_using_if_then, random_string",
                               number=200000)
    print('Time for function using any: {0}\nTime for function using if-then: {1}'.format(func1_time, func2_time))

出力:

Time for function using any: 0.1342546
Time for function using if-then: 0.0201827

if-thenは、他よりもはるかに高速です。


1
正確に私が知りたかったこと:-)
Lars

1
条件付きが他のものを使用するよりもはるかに速い理由を説明できる人はいますか?
Josh、

@ジョシュおそらくそれはより単純だからです。Func1は展開されたリスト内包表記を使用するため、単純なものの場合は自動的にさらに複雑になります。しかし、1000個の文字のために、それがうまくFUNC1使用する方が速いかもしれ
Hack5

@ Hack5はphrase、AからZまでのアルファベットを含む文字列を想定し、一緒に存在しない文字列を出力したい場合は、文字列を使用any()する方が良いでしょうか?または確認する簡単な方法はありますか?
Avishek Datta Ray

そのようなレベルの@Barefaced Bareは、どちらがより良く見えるかを選択します。核を制御しているのでない限り、速度はおそらく問題ではありません(その場合、Pythonを使用するべきではありません)
Hack5

5

これは、文字列がいくつかの組み合わせまたは数字、ドル記号、およびコンマで構成されているかどうかをテストします。それはあなたが探しているものですか?

インポート再

s1 = 'テスト文字列'
s2 = '1234,12345 $'

regex = re.compile( '[0-9、$] + $')

if(regex.match(s1)):
   「s1一致」を出力
そうしないと:
   「s1が一致しませんでした」と出力します

if(regex.match(s2)):
   「s2matched」を出力
そうしないと:
   「s2が一致しませんでした」と出力します

$が文字クラスの場合、$をエスケープする必要はありません。また、これはと一致しますが'testing $tring'、これはOPが実現したいと考えていることではないと思います。
NullUserException

正しく思い出せ'testing $tring'ば、matchメソッドを使用した場合と一致しませんsearch。使用した場合に限られます。だから私は彼のコードは大丈夫だと思います。
dappawit 2011年

@dappaそれでも一致し'$string'ます
NullUserException

-2
s=input("Enter any character:")   
if s.isalnum():   
   print("Alpha Numeric Character")   
   if s.isalpha():   
       print("Alphabet character")   
       if s.islower():   
         print("Lower case alphabet character")   
       else:   
         print("Upper case alphabet character")   
   else:   
     print("it is a digit")   
elif s.isspace():   
    print("It is space character")   

else:
print( "非スペース特殊文字")


1
回答についてもう少し詳しく説明してください。
真鍮のサル

文字列内に存在する文字のタイプのチェック:isalnum():すべての文字が英数字(aからz、AからZ、0から9)の場合はTrueを返しますisalpha():すべての文字がアルファベット記号(aからz、 AからZ)、isdigit():すべての文字が数字のみの場合はTrueを返します(0〜9)islower():すべての文字が小文字のアルファベット記号である場合はTrueを返しますisupper():すべての文字が大文字のアルファベット記号である場合はTrueを返しますistitle():文字列がタイトルの場合はTrueを返しますisspace():文字列がスペースのみの場合はTrueを返します@LazerBass
Nagaraj
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.