2013-03-22 46 views
1

我試圖使用Python regular expression來驗證變量的值。Python:使用正則表達式進行數據驗證

驗證規則如下:

  • 值可以包含任何的a-zA-Z0-9*(無blank,沒有-,沒有,
  • 的同一個數字值可以start(0-9)或字母(a-z, A-Z)*
  • 值可以end以數字(0-9)或字母(a-z, A-Z)*
  • 在中間,該值可以包含目前我使用下面的代碼片段一些(0-9)或字母(a-z, A-Z)*
  • 任何其他值絕不允許

做驗證:

import re 
data = "asdsaq2323-asds" 
if re.compile("[a-zA-Z0-9*]+").match(data).group() == data: 
    print "match" 
else: 
    print "no match" 

我覺得應該有一個更好的方法來做到上述。我在尋找的東西像下面這樣:

validate_func(pattern, data) 
/* returns data if the data passes the validation rules */ 
/* return None if the data does not passes the validation rules */ 
/* should not return part of the data which matches the validation rules */ 

會有這樣一個內建功能存在嗎?

+0

''\ w \ d \ *] +'不夠嗎?最好的測試方法是做一個質量循環來測試你已有的所有值(在列表/文件中)。當循環中的匹配失敗時,您應該將其打印出來,並對其進行更多研究,瞭解哪些內容出錯,並瞭解如何優化RegEx。 – 2013-03-22 22:38:59

回答

4

在一個正則表達式中,元字符^$的意思是「字符串開始」和「結束字符串」(分別);因此,而不是看到什麼比賽,並將其與整個字符串,你可以簡單地要求對正則表達式的整個字符串匹配開始:

import re 
data = "asdsaq2323-asds" 
if re.compile("^[a-zA-Z0-9*]+$").match(data): 
    print "match" 
else: 
    print "no match" 

此外,由於你只使用正則表達式一旦—編譯它,並立即使用—可以用簡便方法re.match來處理,作爲一個單一的步驟:

import re 
data = "asdsaq2323-asds" 
if re.match("^[a-zA-Z0-9*]+$", data): 
    print "match" 
else: 
    print "no match" 
2

我認爲你正在尋找

re.match('^[a-zA-Z0-9*]+$',data) and data 

額外and data剛剛返回的數據,但我不知道爲什麼你需要的。根據None檢查re.match結果足以檢查字符串是否有效。

3

爲了確保整個字符串的模式匹配,使用開始和結束串錨在你的正則表達式中。例如:

regex = re.compile(r'\A[a-zA-Z0-9*]+\Z') 
if regex.match(data): 
    print "match" 
else: 
    print "no match" 

製作這樣的功能:

def validate_func(regex, data): 
    return data if regex.match(data) else None 

實施例:

>>> regex = re.compile(r'\A[a-zA-Z0-9*]+\Z') 
>>> validate_func(regex, 'asdsaq2323-asds') 
>>> validate_func(regex, 'asdsaq2323asds') 
'asdsaq2323asds' 

作爲邊注,我更喜歡\A\Z超過^$像這樣的驗證^$的含義可以根據標誌改變u sed和$將在字符串末尾的換行符之前匹配。