2017-01-23 270 views
0

我有這種模式:^[0-2]{0,1}[0-9]:[0-5][0-9]$。它檢查輸入的字符串是否是時間格式,如01:2020:30等。事情是,我需要檢查輸入的值是否符號正確。因爲如果用戶開始輸入時間並輸入第一個符號,則正則表達式不會自動傳遞,因爲假設1與該模式不匹配。Python的正則表達式:「喜歡」正則表達式模式?

我的意思是讓說,有人開始進入輸入,如:

1,然後0,然後:。這意味着正則表達式檢查仍然應該通過,因爲用戶正在按順序輸入正確的符號。

但如果他讓說進入:

10:,然後a,正則表達式應該在點失敗,當他走進a,因爲被輸入了部分時間是不正確的:10:a永遠不會匹配那最後的正則表達式。

所以有一種方式與正則表達式匹配在like方式的模式。通常搜索是如何工作的,如果你輸入了正確的短語,它會發現你的結果。

代碼段正在爲唯一的 「最終」 值:

In [32]: import re 

In [33]: p = re.compile(r'^[0-2]{0,1}[0-9]:[0-5][0-9]$') 

In [34]: p 
Out[34]: re.compile(r'^[0-2]{0,1}[0-9]:[0-5][0-9]$') 

In [35]: p.search('01:') 

In [36]: p.search('01:10') 
Out[36]: <_sre.SRE_Match at 0x7f163153cf38> 
+0

另一方面,像'p.search('01')'這樣的部分匹配不能保證輸入字符串指向*時間格式* – RomanPerekhrest

+0

@RomanPerekhrest,只要用戶輸入正確的符號在一個序列中,它的確定。如果他按順序輸入任何不正確的東西,他實際上將不能輸入它,因爲檢查將禁止傳遞該符號。 – Andrius

回答

0

如果你喜歡秒以及分鐘和小時,使用下面的正則表達式: R'\ d {2}:\ d {2}:\ d {2}'

1

我可能會指定一個有效的'模板',並檢查將用戶輸入的第一個字符替換爲正則表達式。

REGEX = re.compile(r'^[0-2][0-9]:[0-5][0-9]$') 
TEMPLATE = '00:00' 

def check_partial_input(chars): 
    test_str = chars + TEMPLATE[len(chars):] 
    return bool(REGEX.search(test_str)) 

我認爲這並您打算什麼:

>>> check_partial_input("1") 
True 
>>> check_partial_input("a") 
False 
>>> check_partial_input("01:") 
True 
>>> check_partial_input("01:a") 
False 

的缺點是,它並不能很好的事情就像可選字符在正則表達式的工作(你會發現我做的第一個數字需要)