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

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

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

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

Q&A

1回答

997閲覧

Pythonでの正規表現でのエラー

torataka

総合スコア2

Python 3.x

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

0グッド

0クリップ

投稿2022/08/10 00:29

編集2022/08/10 22:35

前提

お初です。
pythonの初心者用の書物で簡易的な会話BOTシステムを作っています。
書物はpythonプログラミングパーフェクトマスターです。
linkはこちらです。
https://www.shuwasystem.co.jp/book/9784798063676.htmlです。
###################################
このシステム主軸となるclassを作るresponder.pyで
正規表現を返す機能を実装中に以下のエラーメッセージが発生しました。

実現したいこと

事前に準備しておいたテキストファイルから正規表現で取得するようにしたいです

発生している問題・エラーメッセージ

Traceback (most recent call last): File "/Users/komadatakahito/Documents/BOT/GUI/mainWindow.py", line 35, in buttonTalkSlot response = self.pityna.dialogue(value) File "/Users/komadatakahito/Documents/BOT/GUI/pityna.py", line 21, in dialogue return self.responder.response(input) File "/Users/komadatakahito/Documents/BOT/GUI/responder.py", line 27, in response self.dictionary.pattern['pattern'], AttributeError: 'dict' object has no attribute 'pattern'``` ### 該当のソースコード

{responder.py}

import random
import re

class Responder(object):
def init(self, name):
self.name = name
def response(self, input):
return ''
class RepeatResponder(Responder):
def init(self, name):
super().init(name)
def response(self, input):
return '{}ってなに?'.format(input)
class RandomResponder(Responder):
def init(self, name, dic_random): ## ランダム辞書を引数にする
super().init(name)
self.random = dic_random
def response(self, input):
return random.choice(self.random) ## random.txtをランダムにチョイスしていく
class PatternResponder(Responder):
def init(self, name, dictionary):
## Dictionaryオブジェクトを引数にして受け取る
super().init(name)
self.dictionary= dictionary #Dictionaryオブジェクトをself.dictionaryとして受け取る
def response(self, input):
for ptn, prs in zip(
self.dictionary.pattern['pattern'],
self.dictionary.pattern['phrases']
):
print(vars(self))
m = re.search(ptn, input)
if m:
resp = random.choice(prs.split('|'))
return re.sub('\t%match%\t', m.group(), resp)
return random.choice(self.dictionary.random)

## もし必要だったらですが ##
{dictionary.py}

class Dictionary(object):
def init(self):
self.random = self.makeRandomList()
self.pattern = self.makePatternDictionary()
def makeRandomList(self):
rfile = open('GUI/dics/random.txt', 'r', encoding='utf-8')
r_line = rfile.readlines()
rfile.close()

randomList = [] for line in r_line: str = line.rstrip('\n') if (str!=''): randomList.append(str) return randomList def makePatternDictionary(self): pfile = open('GUI/dics/patterns.txt', 'r', encoding='utf-8') p_line = pfile.readlines() pfile.close() new_lines = [] for line in p_line: str = line.rstrip('\n') if (str != ''): new_lines.append(str) patternsDictionary = {} ## 辞書作成 for line in new_lines: ptn= line.split('\t') prs = line.split('\t') # print(type(line), line) patternsDictionary.setdefault('pattern', []).append(ptn) patternsDictionary.setdefault('phrases', []).append(prs) return patternsDictionary

## 実行##
{main.py}
import sys
from PyQt5 import QtWidgets
import mainWindow

このファイルが直接実行された場合に

if name == "main":
app = QtWidgets.QApplication(
sys.argv
)
win = mainWindow.MainWindow()
win.show()
ret = app.exec_()
sys.exit(ret)

{mainWindow.py}

from urllib import response

import pityna as pityna
from PyQt5 import QtWidgets
import qt_PitynaUI

#QtWidgets.QMainWindowを継承したサブクラスUI画面の構築を行う
class MainWindow(QtWidgets.QMainWindow):
#初期化のための処理
def init(self):
#スーパークラスのinit()を呼び出す
super().init()
self.pityna = pityna.Pityna('pityna')
#pitynaオブジェクトを生成
self.action = True
#ラジオボタンの状態を初期化
self.ui = qt_PitynaUI.Ui_MainWindow()
#Ui_MainWindow()オブジェクトを生成
self.ui.setupUi(self)
#setupUi()で画面を構築そしてMAINWINDOW自身を引数にすることが大事

def putlog(self, str):
#QListWidgetクラスのaddmin()でログをリストに追加
self.ui.listWidget.addItem(str)
def prompt(self):
p = self.pityna.get_name()
if self.action == True:
p += ':' + self.pityna.get_responder_name()
return p + '> '
def buttonTalkSlot(self):
value = self.ui.lineEdit.text()

if not value:
self.ui.labelResponse.setText('なに?')
else:
response = self.pityna.dialogue(value)
self.ui.labelResponse.setText(response)
self.putlog('> ' + value)
self.putlog(self.prompt() + response)
self.ui.lineEdit.clear()
def closeEvent(self, event):
reply = QtWidgets.QMessageBox.question(
self,
'確認',
"プログラムを終了しますか?",
buttons = QtWidgets.QMessageBox.Yes |
QtWidgets.QMessageBox.No
)
if reply == QtWidgets.QMessageBox.Yes:
event.accept()
else:
event.ignore()
def showResponderName(self):
self.action = True
def hiddenResponderName(self):
self.action = False

### 試したこと dictにpatternがないとのことでソースコードから見直してみましたが行き詰まりました ### 補足情報(FW/ツールのバージョンなど) python=3.913

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

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

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

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

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

slemntqe

2022/08/10 00:39

responder.pyとdictionary.pyはどのように利用されていますか?別のファイルから呼び出されているように伺えます。回答者がエラーを再現できる形で質問して下さい。
slemntqe

2022/08/10 00:40

GUI/dics/random.txtとGUI/dics/patterns.txtを質問内容に含めて下さい。
slemntqe

2022/08/10 00:55 編集

「発生している問題・エラーメッセー### 該当のソースコード」「正規表現で取得するようにしたいです](url)」質問本文にミスが目立ちます。訂正して下さい。
slemntqe

2022/08/10 00:49

補足情報にPythonのバージョンを明示して下さい。
torataka

2022/08/10 00:51

回答ありがとうございます 1つ入れ忘れていました {main.py}import sys from PyQt5 import QtWidgets import mainWindow ## このファイルが直接実行された場合に if __name__ == "__main__": app = QtWidgets.QApplication( sys.argv ) win = mainWindow.MainWindow() win.show() ret = app.exec_() sys.exit(ret) {mainWindow.py} # from urllib import response import pityna as pityna from PyQt5 import QtWidgets import qt_PitynaUI #QtWidgets.QMainWindowを継承したサブクラスUI画面の構築を行う class MainWindow(QtWidgets.QMainWindow): #初期化のための処理 def __init__(self): #スーパークラスのinit()を呼び出す super().__init__() self.pityna = pityna.Pityna('pityna') #pitynaオブジェクトを生成 self.action = True #ラジオボタンの状態を初期化 self.ui = qt_PitynaUI.Ui_MainWindow() #Ui_MainWindow()オブジェクトを生成 self.ui.setupUi(self) #setupUi()で画面を構築そしてMAINWINDOW自身を引数にすることが大事 def putlog(self, str): #QListWidgetクラスのaddmin()でログをリストに追加 self.ui.listWidget.addItem(str) def prompt(self): p = self.pityna.get_name() if self.action == True: p += ':' + self.pityna.get_responder_name() return p + '> ' def buttonTalkSlot(self): value = self.ui.lineEdit.text() if not value: self.ui.labelResponse.setText('なに?') else: response = self.pityna.dialogue(value) self.ui.labelResponse.setText(response) self.putlog('> ' + value) self.putlog(self.prompt() + response) self.ui.lineEdit.clear() def closeEvent(self, event): reply = QtWidgets.QMessageBox.question( self, '確認', "プログラムを終了しますか?", buttons = QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No ) if reply == QtWidgets.QMessageBox.Yes: event.accept() else: event.ignore() def showResponderName(self): self.action = True def hiddenResponderName(self): self.action = False と異常になります
slemntqe

2022/08/10 00:55

質問本文に追記して下さい。
torataka

2022/08/10 01:00

今追記します
torataka

2022/08/10 01:05

いましました
slemntqe

2022/08/10 01:06

私が依頼したのはこちらの質問本文の追記・修正依頼です。あなたが行ったのは新しい質問の投稿です。重複した投稿は認められていません。質問本文の右下にゴミ箱アイコンがあるのでteratail運営に削除依頼を提出して下さい。
slemntqe

2022/08/10 01:07

削除するのは新しい投稿の方です。間違ってもこちらを削除しないで下さい。
torataka

2022/08/10 01:23

いま編集いたしました。 そして新しい投稿も削除いたしました 大変申し訳ありません
TakaiY

2022/08/10 01:25 編集

(かぶったので、削除します)
slemntqe

2022/08/10 01:26

質問本文のmain.pyのソースコードを訂正して下さい。私が1つ1つ指摘しなければ改善されませんか?あなたが回答者の立場になった時に今の質問文を見て回答がしやすいでしょうか?回答者の立場になって考えて下さい。
torataka

2022/08/10 01:28

はい ご教授ありがとうございます
meg_

2022/08/10 11:01

> pythonの初心者用の書物で簡易的な会話BOTシステムを作っています。 書名を書かれると回答が付きやすくなるかもしれません。
torataka

2022/08/10 11:32

はいありがとうございます
torataka

2022/08/10 11:54

いま、編集いたしました
meg_

2022/08/10 12:06 編集

mainWindow.pyのインデントが消えているようです。
meg_

2022/08/10 12:14

'pityna'とは何でしょうか?
torataka

2022/08/10 12:38

pytyna.pyのことでしょうか。 それはこの会話ボットの主軸となるsystemを構築しているファイルとなります。
meg_

2022/08/10 13:35 編集

それがないので「ModuleNotFoundError: No module named 'pityna'」が発生します。 ※コードはインデントが分かる状態にしないと回答はつきにくいかと思いますよ。(質問を編集する際はプレビューで確認してください。)
guest

回答1

0

今質問を編集しました

投稿2022/08/10 01:26

torataka

総合スコア2

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問