3

私はPython 2.7.3を使用しています。次の機能があります。

def is2To4Numbers(q):
    if re.match('[0-9]{2,4}',q):return True
    else: return False

桁数を2から4に制限しようとしていますが、これらの結果が得られます。

>>> is2To4Numbers('1235')
True

>>> is2To4Numbers('1')
False

>>> is2To4Numbers('12345')
True

>>> is2To4Numbers('1234567890')
True

適切な制限を取得できないようです。これをどのように解決すればよいですか?{m,n} を使用する以外に方法はありますか? または、{m,n} を正しく使用していますか?

4

2 に答える 2

11

あなたの正規表現は、より大きな数字の中に存在する2〜4桁を探すだけです。これを追加:

'^[0-9]{2,4}$'

組み込みの数値テストを使用して、次のように大なりチェックと小なりチェックを追加する方がはるかに簡単かもしれません。

def is2To4Numbers(q):
    try:
        return 10 <= int(q) <= 9999
    except:
        return False
于 2013-01-04T19:06:08.240 に答える
5

より大きな文字列で正確に 2 ~ 4 桁を検索する必要があり、パターンの一部として^andを使用できない場合は、否定後読み( ) と否定後読み( ) を使用できます。$?<!?!

import re

def is2To4Numbers(q):
    return bool(re.search(r'''(?x)    # verbose mode
                              (?<!\d) # not preceded by a digit 
                              \d{2,4} # 2-to-4 digits
                              (?!\d)  # not followed by a digit
                              ''',q))

tests = ['1', '12', '123', '1234', '12345', 'foo12', '123bar']
for test in tests:
    print('{t:6} => {r}'.format(t = test, r = is2To4Numbers(test)))

収量

1      => False
12     => True
123    => True
1234   => True
12345  => False
foo12  => True
123bar => True
于 2013-01-04T19:19:49.653 に答える