无法找到正则表达式错误

时间:2017-08-26 20:12:29

标签: regex python-3.x

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语句的问题是什么?

1 个答案:

答案 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]* - 从19的数字,然后是任意0+数字
  • (?:\.\d+)? - 一个可选的非捕获组,匹配1或0次出现:
    • \. - 一个点
    • \d+ - 一位或多位数。