使用基于正则表达式的模式匹配

时间:2017-09-21 22:51:28

标签: python regex string input

我遇到一个问题,用户可以在括号内输入任意数量的(x,y)坐标。例如, 用户A可以输入(1,1) (1,2) (1,3)

User B : (1,1)
User C : (3,2) (5,5) (6,1)

我想要一个通用模式匹配来检查用户输入的输入是否有效。输入仅在遵循上述格式时有效。也就是(x,y)\s(a,b)\s(c,d)。我是正则表达式匹配的新手,我尝试过(\\(\d,\d\\)\s){1,}。这似乎不起作用。此外,在最后一次协调进入后,空间不应该存在。有人可以帮我解决这个问题吗?

提前致谢。

3 个答案:

答案 0 :(得分:4)

如果您想验证整个输入,我建议使用re.match

>>> pattern = re.compile('(\(\d+,\d+\)\s*)+$')    
>>> def isValid(string):
...     return bool(pattern.match(string.strip()))
... 
>>> string = '(1,1) (1,2) (1,3)'
>>> isValid(string)
True

整个字符串匹配,或者没有匹配。默认情况下,re.match从头开始,如果字符串有效则返回match对象,否则返回Nonebool结果将用于评估此表达式的真实性。

请注意,空格字符已设为可选项以简化表达式。如果您想要严格匹配,我建议您查看DYZ' answer

正则表达式详细信息

(        # capturing group 
    \(       # opening paren 
    \d+      # 1 or more digits
    ,        # comma
    \d+      
    \)       # closing paren
    \s*      # 0 or more whitespace chars
)+       # specify repeat 1 or more times
$        # end of string

答案 1 :(得分:2)

我包含对多位数字的支持,以防万一:

pattern = r"(\(\d+,\d+\)\s)*\(\d+,\d+\)$"
re.match(pattern, "(1,1) (1,2) (1,3)")
#<_sre.SRE_Match object; span=(0, 17), match='(1,1) (1,2) (1,3)'>
re.match(pattern, "(1,1)")
#<_sre.SRE_Match object; span=(0, 5), match='(1,1)'>
re.match(pattern, "(1,1) (1,2) (1,3) ") # no match
re.match(pattern, "(1,1) (1,2)(1,3)") # no match

答案 2 :(得分:0)

你可以试试这个:

import re

s = "(1,1) (1,2) (1,3)"
if re.findall("(\(\d+,\d+\)\s)|(\(\d+,\d+\)$)", s):
   pass