-1

こんにちは、stackoverflow、プログラムに問題があります。入力した文字列が英数字かどうかをテストしたい。

def logUtb(fl, str):
now = datetime.datetime.now()
  fl.write(now.strftime('%Y-%m-%d %H:%M') + " - " + str + "\n");
  return;

#Test alphanumeric
def testValidationAlphaNum():
    valid = re.match('[A-Za-z0-9]', '!@#@$@$@')
    if valid == True:
        logUtb(f, 'Alphanumeric')
    else:
        logUtb(f, 'Unknown characters')

ご覧のとおり、'!@#@$@$@' を入力して、正規表現パターンでテストしました。レポートログに「不明な文字」を返す代わりに、英数字を返します。私のプログラムの何が問題なのか教えてください。ありがとう!

4

3 に答える 3

4

re.match()None文字列が一致しなかった場合は を返し、一致した場合は を返しますMatchObject。したがって、== Trueテストが満足されることはありません。実際に'Alphanumeric'出力が表示されている場合は、投稿したコードの結果ではありません。

いずれにせよ、これには次を使用する必要がありますstr.isalnum()

>>> 'abc'.isalnum()
True
于 2013-09-20T02:26:29.130 に答える
0

ここで str.isalnum() を呼び出す方が簡単なオプションになると言っている他の人に同意します。

ただし、試した正規表現パターンに関していくつか指摘したいと思います。アレックス・ボールドウィンが言ったように、そのままのパターンは、文字列の先頭にある単一の英数字のみを探します。そのため、文字列の残りの部分に何か他のものが含まれていても、一致する可能性があります。

代わりにすべきことは、文字クラスを数量化し、そのクラスを文字列の最後に固定することです。文字列に英数字が含まれていることをテストするには、少なくとも 1 つの英数字を検索する + 量指定子を選択する必要があります。$ を使用してパターンを文字列の末尾に固定するようにしてください。

re.match('[A-Za-z0-9]+$', '!@#@$@$@')

もちろん、これは指定された文字列に対して false を返します。ここで * を使用する際の問題は、空の文字列に対しても MatchObject が返されることです。少なくとも 1 つの英数字が存在する必要があると思います。re.match() は文字列の先頭でのみ検索を開始するため、^ を使用して文字クラスを文字列の先頭に固定する必要がないことにも注意してください。次に、条件付きでテストしたいのは、MatchObject が re.match() によって返されたかどうかです。

valid = re.match('[A-Za-z0-9]+$', '!@#@$@$@')
    if valid:
        logUtb(f, 'Alphanumeric')
    else:
        logUtb(f, 'Unknown characters')

量指定子とアンカーに関する追加情報は、ドキュメントに記載されています。

http://docs.python.org/2/library/re.html

于 2013-09-21T14:03:51.253 に答える