2017-08-26 9 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桁以上と一致すると想定して、1桁以上の数字とできるだけ一致しないことです。今一致し、

^\([+-]?((?:0|[1-9][0-9]*)(?:\.\d+)?),\s[+-]?((?:0|[1-9][0-9]*)(?:\.\d+)?)\)$ 

regex demo

番号、(?:0|[1-9][0-9]*)(?:\.\d+)?に一致する部分を参照してください:

は、任意の非キャプチャグループ(?:\.\d+)?を使用し、.xxx一部のオプションにするには

  • (?:0|[1-9][0-9]*) - 2つの選択肢のいずれかと一致する非キャプチャグループ:
    • 0 - ゼロ
    • |
    • - 又は
    • [1-9][0-9]*から1から9および桁次いで任意の0+数字
  • (?:\.\d+)?から1または0の出現と一致する任意の非捕捉基の:
    • \. - ドット
    • \d+ - 1桁以上
+1

ありがとうございます!それはうまくいった。 –

関連する問題