web-dev-qa-db-ja.com

文字列が文字とスペースのみであるかどうかの確認-Python

pythonを取得して、文字列にアルファベットとスペースのみが含まれていることを返すようにしています

string = input("Enter a string: ")

if all(x.isalpha() and x.isspace() for x in string):
    print("Only alphabetical letters and spaces: yes")
else:
    print("Only alphabetical letters and spaces: no")

pleaseを試しましたが、Only alphabetical letters and spaces: noと表示されます。orの代わりにandを使用しましたが、1つの条件を満たすだけです。両方の条件を満たす必要があります。つまり、文には文字のみおよびスペースのみが含まれている必要がありますが、各種類が少なくとも1つ含まれている必要があります。 not数字を含める必要があります。

文字とスペースの両方を返すためにpythonは文字列にのみ含まれているため、ここで何が欠けていますか?

8
sithlorddahlia

文字をアルファおよびスペースにすることはできません。アルファまたはスペースにすることができます。

文字列にアルファとスペースのみが含まれていることを要求するには:

string = input("Enter a string: ")

if all(x.isalpha() or x.isspace() for x in string):
    print("Only alphabetical letters and spaces: yes")
else:
    print("Only alphabetical letters and spaces: no")

文字列に少なくとも1つのアルファと少なくとも1つのスペースが含まれていることを要求するには:

if any(x.isalpha() for x in string) and any(x.isspace() for x in string):

文字列に少なくとも1つのアルファ、少なくとも1つのスペース、およびアルファとスペースのみが含まれていることを要求するには、次のようにします。

if (any(x.isalpha() for x in string)
    and any(x.isspace() for x in string)
    and all(x.isalpha() or x.isspace() for x in string)):

テスト:

>>> string = "PLEASE"
>>> if (any(x.isalpha() for x in string)
...     and any(x.isspace() for x in string)
...     and all(x.isalpha() or x.isspace() for x in string)):
...     print "match"
... else:
...     print "no match"
... 
no match
>>> string = "PLEASE "
>>> if (any(x.isalpha() for x in string)
...     and any(x.isspace() for x in string)
...     and all(x.isalpha() or x.isspace() for x in string)):
...     print "match"
... else:
...     print "no match"
... 
match
14
rob mayoff

正しい解決策はorを使用します。

_string = input("Enter a string: ")

if all(x.isalpha() or x.isspace() for x in string):
    print("Only alphabetical letters and spaces: yes")
else:
    print("Only alphabetical letters and spaces: no")
_

文字列はありますが、その文字列の文字を繰り返し処理しているため、一度に1文字ずつ使用できます。したがって、文字だけをアルファベットとスペースにすることはできませんが、制約を満たすには2つのうちの1つである必要があります。

編集:他の回答であなたのコメントを見ました。 alphabet = string.isalpha() return True、文字列内のall文字がアルファベット文字である場合に限ります。スペースのある文字列yesで実行すると、コードでpleaseを出力するように指定したため、これは必要なことではありません。文字列全体ではなく、各文字を個別にチェックする必要があります。

コードが本当に正しいことを納得させるためだけに(まあ、わかりました、納得させるには自分で実行する必要がありますが、とにかく):

_>>> string = "please "
>>> if all(x.isalpha() or x.isspace() for x in string):
    print("Only alphabetical letters and spaces: yes")
else:
    print("Only alphabetical letters and spaces: no")


Only alphabetical letters and spaces: yes
_

編集2:新しいコメントから判断すると、次のようなものが必要です。

_def hasSpaceAndAlpha(string):
    return any(char.isalpha() for char in string) and any(char.isspace() for char in string) and all(char.isalpha() or char.isspace() for char in string)

>>> hasSpaceAndAlpha("text# ")
False
>>> hasSpaceAndAlpha("text")
False
>>> hasSpaceAndAlpha("text ")
True
_

または

_def hasSpaceAndAlpha(string):
    if any(char.isalpha() for char in string) and any(char.isspace() for char in string) and all(char.isalpha() or char.isspace() for char in string):
        print("Only alphabetical letters and spaces: yes")
    else:
        print("Only alphabetical letters and spaces: no")

>>> hasSpaceAndAlpha("text# ")
Only alphabetical letters and spaces: no
>>> hasSpaceAndAlpha("text")
Only alphabetical letters and spaces: no
>>> hasSpaceAndAlpha("text ")
Only alphabetical letters and spaces: yes
_
3
nikaltipar

文字列にそれぞれを少なくとも1つ必要とする場合は、 any が必要です。

if any(x.isalpha() for x in string) and any(x.isspace() for x in string):

それぞれの文字を少なくとも1つ必要とし、他の文字は必要ない場合は、allanystr.translate を組み合わせることができます。以下では、少なくとも1つのスペース、1つのアルファがあり、それらのみが含まれている場合にのみTrueを返します。文字。

 from string import ascii_letters

 s = input("Enter a string: ")

 tbl = {ord(x):"" for x in ascii_letters + " "}

if all((any(x.isalpha() for x in s),
   any(x.isspace() for x in s),
   not s.translate(tbl))):
    print("all good")

それぞれにanyが少なくとも1つあるかどうかを確認してから、文字列を変換します。文字列が空の場合は、英字とスペースしかありません。これは大文字と小文字で機能します。

コードを単一のif/andに凝縮できます。

from string import ascii_letters

s = input("Enter a string: ")
s_t = s.translate({ord(x):"" for x in ascii_letters})

if len(s_t) < len(s) and s_t.isspace():
    print("all good")

翻訳された文字列の長さが<オリジナルで、残っているのがスペースだけの場合、要件を満たしています。

または、ロジックを逆にしてスペースを変換し、アルファだけが残っているかどうかを確認します。

s_t = s.translate({ord(" "):"" })
if len(s_t) < len(s) and s_t.isalpha():
    print("all good")

文字列には常にスペースよりも多くのアルファがあると仮定すると、最後の解決策がはるかに効率的であるはずです。

2

実はパターンマッチングの練習なので、パターンマッチングを使ってみませんか?

_import re
r = re.compile("^[a-zA-Z ]*$")
def test(s):
    return not r.match(s) is None  
_

または、ソリューションでany()を使用するための要件はありますか?

2
flaschbier
    string = input("Enter a string: ")
    st1=string.replace(" ","").isalpha()
    if (st1):
        print("Only alphabetical letters and spaces: yes")
    else:
        print("Only alphabetical letters and spaces: no")
0