import re
reg = r'^[(][+-]?([0]|([1-9][0-9]*)\.?\d+?),\s[+-]?([0]|([1-9][0-9]*)\.?\d+?)[)]$'
for _ in range(int(input())):
coord = input()
if re.search(reg, coord):
if 0 <= float(re.search(reg, coord).group(1)) <= 90 and 0 <= float(re.search(reg, coord).group(3)) <= 180:
print('Valid')
else: print('Invalid')
else: print('Invalid')
这是我查找坐标的正则表达式的代码。我在正则表达式中找不到错误。不起作用的测试用例是(-6,-165)和(-6,-172)阻止代码进入第一个if语句的问题是什么?
答案 0 :(得分:1)
主要问题是\d+?
匹配1位或更多位数,尽可能少,而您假设它匹配0位或更多位数。
要使.xxx
部分可选,请使用可选的非捕获组(?:\.\d+)?
:
^\([+-]?((?:0|[1-9][0-9]*)(?:\.\d+)?),\s[+-]?((?:0|[1-9][0-9]*)(?:\.\d+)?)\)$
请参阅regex demo
与数字匹配的部分(?:0|[1-9][0-9]*)(?:\.\d+)?
现在匹配:
(?:0|[1-9][0-9]*)
- 与两个替代方案中的任何一个匹配的非捕获组:
0
- 零|
- 或[1-9][0-9]*
- 从1
到9
的数字,然后是任意0+数字(?:\.\d+)?
- 一个可选的非捕获组,匹配1或0次出现:
\.
- 一个点\d+
- 一位或多位数。