2017-01-23 355 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 

的缺点是,它并不能很好的事情就像可选字符在正则表达式的工作(你会发现我做的第一个数字需要)