質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

1798閲覧

Python 正規表現について

north_redwings

総合スコア32

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/05/10 06:38

Pythonで入力した数が整数でも有理数でも計算できるプログラムを書きたいと思っています。

Python

1import re 2 3class Rat: 4 n = 0 5 d = 0 6 7 def __init__(self, n, d): 8 self.n = n 9 self.d = d 10 11 def gcd(a, b): 12 if(a % b == 0): 13 return b 14 else: 15 return Rat.gcd(b, a % b) 16 17 def __repr__(self): 18 if(self.d / Rat.gcd(self.n, self.d) != 1): 19 return '{}/{}'.format(int(self.n / Rat.gcd(self.n, self.d)), int(self.d / Rat.gcd(self.n, self.d))) 20 elif(self.d / Rat.gcd(self.n, self.d) == 1): 21 return '{}'.format(int(self.n / Rat.gcd(self.n, self.d))) 22 23 def __add__(self, other): 24 return Rat((self.n * other.d) + (self.d * other.n), (self.d * other.d)) 25 26 def __sub__(self, other): 27 return Rat((self.n * other.d) - (self.d * other.n), (self.d * other.d)) 28 29 def __mul__(self, other): 30 return Rat((self.n * other.n), (self.d * other.d)) 31 32 def __truediv__(self, other): 33 return Rat((self.n * other.d), (self.d * other.n)) 34 35 36def is_int(arg): 37 """ 38 int型かどうか調べる関数 39 """ 40 try: 41 int(arg) 42 return True 43 44 except ValueError: 45 return False 46 47def input_number(): 48 """ 49 標準入力で分数あるいは整数を受け取り、全て分数に変換して返す関数 50 """ 51 while(True): 52 msg = input("Number is fraction or integer? Enter (f or i):") 53 54 if(msg == "i"): 55 num = input("Enter integer:") 56 if(is_int(num)): 57 num = Rat(int(num), 1) 58 break 59 else: 60 print("ValueError : not integer") 61 continue 62 63 elif(msg == "f"): 64 tmp = input("Enter fraction like 3/5:") 65 print(re.match("//", tmp)) 66 if(re.match("//", tmp)): 67 tmp_list = re.split("//", tmp) 68 print(tmp_list) 69 if((is_int(tmp[0]) and is_int(tmp[1]))): 70 num = Rat(int(tmp[0]), int(tmp[1])) 71 print(num) 72 break 73 else: 74 print("ValueError : not fraction") 75 continue 76 77 elif(msg == "quit"): 78 exit() 79 80 return num 81 82def main(): 83 num1 = input_number() 84 num2 = input_number() 85 86 print() 87 print("Arithmetic of num1 & num2") 88 print("({}) + ({}) = {}".format(num1, num2, num1 + num2)) 89 print("({}) - ({}) = {}".format(num1, num2, num1 - num2)) 90 print("({}) * ({}) = {}".format(num1, num2, num1 * num2)) 91 print("({}) / ({}) = {}".format(num1, num2, num1 / num2)) 92 print() 93 94if __name__ == "__main__": 95 main()

しかし、実行すると分数の"/"で分割して分数の分母分子を区別したいのに、コマンドラインで"/"を入力しても認識されません。おそらくは正規表現の部分でNoneと返って来ているのでその部分が怪しいと思うのですが・・・。

Terminal

1Yuji-no-MacBook-Air:tmp_file YujiNarita$ python hw0423.py 2Number is fraction or integer? Enter (f or i):f 3Enter fraction like 3/5:23/34 4None 5Number is fraction or integer? Enter (f or i):quit 6Yuji-no-MacBook-Air:tmp_file YujiNarita$ python hw0423.py 7Number is fraction or integer? Enter (f or i):i 8Enter integer:6 9Number is fraction or integer? Enter (f or i):i 10Enter integer:8 11 12Arithmetic of num1 & num2 13(6) + (8) = 14 14(6) - (8) = -2 15(6) * (8) = 48 16(6) / (8) = 3/4 17 18Yuji-no-MacBook-Air:tmp_file YujiNarita$

なお、上記の通り、整数では問題なく計算できました。また、正規表現を使わず("/"をコマンドラインで入力し忘れるなどのErrorを無視して)書いた場合は有理数でも問題なく計算できたのでclass Ratの部分は間違っていないかと思われます。

もし記載不足などございましたらご指摘いただけると幸いです。また、コードの書き方などもご指摘いただければと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Python

tmp = input("Enter fraction like 3/5:")
print(re.match("//", tmp))

間違いが二つあります。
0. re.matchは、先頭一致を判定するものです。
0. スラッシュはメタ文字としての意味を持ちませんから、単に'/'でいいです。

単に『スラッシュが含まれるかどうか』を判定したいのであれば、正規表現は不要です。

Python

1tmp = input("Enter fraction like 3/5:") 2print('/' in tmp)

なお

fractionsモジュールが標準で用意されているので、こちらを使うと楽です。

投稿2018/05/10 06:45

編集2018/05/10 06:53
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

north_redwings

2018/05/10 07:06

先頭だったんですね・・・。勉強不足でした。 ()でキャプチャして成功しました、ありがとうございました。
guest

0

Python

1import re 2 3class Rat: 4 n = 0 5 d = 0 6 7 def __init__(self, n, d): 8 self.n = n 9 self.d = d 10 11 def gcd(a, b): 12 if(a % b == 0): 13 return b 14 else: 15 return Rat.gcd(b, a % b) 16 17 def __repr__(self): 18 if(self.d / Rat.gcd(self.n, self.d) != 1): 19 return '{}/{}'.format(int(self.n / Rat.gcd(self.n, self.d)), int(self.d / Rat.gcd(self.n, self.d))) 20 elif(self.d / Rat.gcd(self.n, self.d) == 1): 21 return '{}'.format(int(self.n / Rat.gcd(self.n, self.d))) 22 23 def __add__(self, other): 24 return Rat((self.n * other.d) + (self.d * other.n), (self.d * other.d)) 25 26 def __sub__(self, other): 27 return Rat((self.n * other.d) - (self.d * other.n), (self.d * other.d)) 28 29 def __mul__(self, other): 30 return Rat((self.n * other.n), (self.d * other.d)) 31 32 def __truediv__(self, other): 33 return Rat((self.n * other.d), (self.d * other.n)) 34 35 36def is_int(arg): 37 """ 38 int型かどうか調べる関数 39 """ 40 try: 41 int(arg) 42 return True 43 44 except ValueError: 45 return False 46 47def input_number(): 48 """ 49 標準入力で分数あるいは整数を受け取り、全て分数に変換して返す関数 50 """ 51 while(True): 52 msg = input("Number is fraction or integer? Enter (f or i):") 53 54 if(msg == "i"): 55 num = input("Enter integer:") 56 if(is_int(num)): 57 num = Rat(int(num), 1) 58 break 59 else: 60 print("ValueError : not integer") 61 continue 62 63 elif(msg == "f"): 64 tmp = input("Enter fraction like 3/5:") 65 m = re.match("(\d+)(/)(\d+)", tmp) 66 if m: 67 num = Rat(int(m.group(1)), int(m.group(3))) 68 break 69 else: 70 print("ValueError : not fraction") 71 continue 72 73 elif(msg == "quit"): 74 exit() 75 76 return num 77 78def main(): 79 num1 = input_number() 80 num2 = input_number() 81 82 print() 83 print("Arithmetic of num1 & num2") 84 print("({}) + ({}) = {}".format(num1, num2, num1 + num2)) 85 print("({}) - ({}) = {}".format(num1, num2, num1 - num2)) 86 print("({}) * ({}) = {}".format(num1, num2, num1 * num2)) 87 print("({}) / ({}) = {}".format(num1, num2, num1 / num2)) 88 print() 89 90if __name__ == "__main__": 91 main() 92

投稿2018/05/10 07:07

north_redwings

総合スコア32

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問