2017-08-26 28 views
1
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

主要問題是\d+?匹配一個或多個數字,儘可能少,而您認爲它匹配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的出現可選的非捕獲組作者:
    • \. - a dot
    • \d+ - 1位或更多位數。
+1

謝謝!這工作。 –