我遇到一个问题,用户可以在括号内输入任意数量的(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,}
。这似乎不起作用。此外,在最后一次协调进入后,空间不应该存在。有人可以帮我解决这个问题吗?
提前致谢。
答案 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
对象,否则返回None
。 bool
结果将用于评估此表达式的真实性。
请注意,空格字符已设为可选项以简化表达式。如果您想要严格匹配,我建议您查看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