文字列にアルファベットの文字が含まれているかどうかを確認するための最も純粋なPython実装は何ですか?
string_1 = "(555).555-5555"
string_2 = "(555) 555 - 5555 ext. 5555
どこにstring_1
戻ってくるFalse
ことにアルファベットのない手紙を持っていないためとstring_2
戻ってくるTrue
手紙を持つために。
文字列にアルファベットの文字が含まれているかどうかを確認するための最も純粋なPython実装は何ですか?
string_1 = "(555).555-5555"
string_2 = "(555) 555 - 5555 ext. 5555
どこにstring_1
戻ってくるFalse
ことにアルファベットのない手紙を持っていないためとstring_2
戻ってくるTrue
手紙を持つために。
回答:
正規表現は迅速なアプローチである必要があります。
re.search('[a-zA-Z]', the_string)
any(c.isalpha() for c in string_1)
おいしくPythonicです。
isalpha
意味ですか?Python2とPython3を比較すると、これはまったく異なる動作になります。中国語はアルファベットの一部ですか?そうでない場合は、Python 3(またはUnicode文字列の場合はPython 2!)のジェネレーターと盲目的に一致させています。あなたがしたい場合にPythonを、ここにあります:Simple is better than complex.
。そして、上記のOPのコメントを確認してください。彼はローマ字のみを一致させたいと考えています。
Match
場合、一致するものがある場合、または一致しないNone
場合はオブジェクトを取得します。したがって、これはif re.search(...
パターンと互換性があります。
どうですか:
>>> string_1 = "(555).555-5555"
>>> string_2 = "(555) 555 - 5555 ext. 5555"
>>> any(c.isalpha() for c in string_1)
False
>>> any(c.isalpha() for c in string_2)
True
set(string_1)
、よりefficentこと?
set
と、関数呼び出しが減るかどうかはわかりませんが、オーバーヘッドがいくらか追加されます。
islower()
文字列で使用して、(他の文字の中でも)小文字が含まれているかどうかを確認できます。or
それにisupper()
もいくつかの大文字が含まれているかどうかをチェックします。
以下:文字列内の文字:テストはtrueを生成します
>>> z = "(555) 555 - 5555 ext. 5555"
>>> z.isupper() or z.islower()
True
以下:文字列に文字がありません:テストはfalseを生成します。
>>> z= "(555).555-5555"
>>> z.isupper() or z.islower()
False
>>>
すべての文字が文字である場合にのみisalpha()
返されるwhichと混同しTrue
ないでください。これは、必要なものではありません。
私は混合ケースをうまく処理できないので、Barmの答えは私のものをうまく完成させることに注意してください。
@jean-françois-fabreからの回答が気に入りましたが、不完全です。
彼のアプローチは機能しますが、テキストに純粋に小文字または大文字が含まれている場合に限ります。
>>> text = "(555).555-5555 extA. 5555"
>>> text.islower()
False
>>> text.isupper()
False
より良いアプローチは、最初に文字列を大文字または小文字にしてからチェックすることです。
>>> string1 = "(555).555-5555 extA. 5555"
>>> string2 = '555 (234) - 123.32 21'
>>> string1.upper().isupper()
True
>>> string2.upper().isupper()
False
上記の各方法をテストして、特定の文字列にアルファベットが含まれているかどうかを確認し、標準的なコンピューターで文字列ごとの平均処理時間を調べました。
〜250 ns
import re
〜3 µs
re.search('[a-zA-Z]', string)
〜6 µs
any(c.isalpha() for c in string)
〜850 ns
string.upper().isupper()
主張されているのとは反対に、reのインポートにかかる時間はごくわずかであり、reを使用した検索には、比較的小さな文字列であってもisalpha()を繰り返す場合に比べて約半分の時間がかかります。
したがって、文字列が大きくカウントが大きい場合、reの方がはるかに効率的です。
ただし、文字列を大文字小文字に変換して大文字小文字をチェックする(つまり、upper()。isupper()またはlower()。islower()のいずれか)がここで優先されます。すべてのループで、re.search()よりも大幅に高速であり、追加のインポートも必要ありません。
さらにこれを行うこともできます
import re
string='24234ww'
val = re.search('[a-zA-Z]+',string)
val[0].isalpha() # returns True if the variable is an alphabet
print(val[0]) # this will print the first instance of the matching value
また、変数valがNoneを返す場合にも注意してください。これは、検索で一致するものが見つからなかったことを意味します