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

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

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

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

受付中

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

torataka
torataka

総合スコア2

Python 3.x

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

1回答

-1評価

0クリップ

427閲覧

投稿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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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'」が発生します。 ※コードはインデントが分かる状態にしないと回答はつきにくいかと思いますよ。(質問を編集する際はプレビューで確認してください。)

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

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