2014-06-20 98 views
2

HTML表單返回給我一個由用戶輸入的數字字符串。如何使用正則表達式來查看它是否能夠成爲數字。我不是簡單地想要去掉逗號,看看它是否可以轉換爲int,也不喜歡locale.atoi方法,因爲即使它們是無意義的(例如locale.atoi('01,0,0')計算爲100),字符串也會忽略數字。如果字符串包含逗號只發生用於檢查字符串的正則表達式是整數

NB此驗證

重新圖案應該是:

第一字符是1-9(不爲零) 第二和第三字符是0-9 然後3數字1-9和0和2倍之間重複逗號(999,999,999,999是在程序中可能最大數目) 然後最後3位數字1-9

compiled = re.compile("[1-9][0-9]{0,2},(\d\d\d,){0,2}[0-9]{3}") 

未配套配件g正確結束字符串,例如:

re.match(compiled, '123,456,78') 

與之匹配。我做錯了什麼?

+0

你在最後提到的三個數字。但是你的字符串最後只有2位數字。 –

+0

是的確切,即它不應該匹配,但它! –

+0

你爲什麼不分組你所有的表情? '([1-9] [0-9] {0,2},(\ d \ d \ d,){0,2} [0-9] {3})'你能發佈匹配的例子嗎? – Llopis

回答

1

更緊湊

我建議更多的東西緊湊:

^[1-9][0-9]{0,2}(?:,[0-9]{3}){0,3}$ 

the demo

  • ^斷言,我們是在字符串的開頭
  • [1-9]火柴我們的第一個數字
  • [0-9]{0,2}最多匹配兩位數字
  • (?:,[0-9]{3})匹配一個逗號和三位數字...
  • 三者之間0和時間
  • $斷言,我們是在字符串

爲了驗證結束後,你可以這樣做:

if re.search("^[1-9][0-9]{0,2}(?:,[0-9]{3}){0,3}$", subject): 
    # Successful match 
else: 
    # Match attempt failed 
+0

@Downvoter,謹慎地解釋你對這個緊湊的工作模式的行動,並給出解釋和演示? – zx81

+0

非常整潔,與''的處理是什麼?'?' –

+0

我現在明白,你必須說當你在字符串的開始/結尾。在我沒有這樣做的例子中,這意味着(\ d \ d \ d){0,2}在'123'和'456'和[0-9] {3}匹配'123'和'456'?非常感謝 –

1

如果你想完整的字符串匹配,確保指定的立場,並在你的正則表達式的結束,即:

re.compile(r"^[1-9][0-9]{0,2},(\d\d\d,){0,2}[0-9]{3}$") 

而且,你會發現,我用了一個原始字符串(r前綴)以避免逃脫\

編輯

只是爲了解釋這是怎麼回事你的正則表達式,最小的子串,將匹配的,其中第一組數字是匹配的零次,第二組也匹配零次:,即"[1-9][0-9]{0},(\d\d\d,){0}[0-9]{3}",與[0-9]{3}相同。由於這可以匹配任何字符串,因此它可以匹配"123""456"

+0

我想我明白了一點:在我的例子'(\ d \ d \ d,){0,2}'在'123','456'和[0-9] {3}匹配'123'和'456'。是對的嗎?我沒有意識到你必須指定字符串的開始和結束。不同之處在於比賽是沿着繩子順序發生的 - 是嗎? –

相關問題