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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3406閲覧

PYTHON 正規表現について

yuujiMotoki

総合スコア90

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/08/28 12:27

編集2019/08/28 12:27

pythonでの正規表現(re)で躓いています。

FLASKでローカルWEBサーバを立てて、インタネットからWEBHOOKメッセージを受けて
別のアプリにzmqでメッセージリクエストを送るコードを書いています。

WEBHOOKされるメッセージは、JSON形式で送られており、
その中に、USD/jpyといった 通貨ペアがあり、
それを正規表現で抜き出すコードを書いています。

どうやら、文字列をバイトコードで変換している旨の
警告が出ています。

** result = re.match(rb'[A-Z]{3}[/][A-Z]{3}',res2)**

TypeError: cannot use a string pattern on a bytes-like object

このコードをどう直せば、REQメッセージで送れるものでしょうか?

正規表現のライブラリ、REの使い方で躓いており、先に進めません。

すみませんが、WEB通信と、pythonについては素人なので、
そもそも書き方に自信がありません。

return self.view_functions[rule.endpoint](**req.view_args) File "C:/Users/moto/Documents/GitHub/infooff/タイトル無し0.py", line 30, in webhook res2 = re.match(r'[A-Z]{3}[/][A-Z]{3}',res2) File "C:\Users\moto\Anaconda3\lib\re.py", line 173, in match return _compile(pattern, flags).match(string) **TypeError: cannot use a string pattern on a bytes-like object** 127.0.0.1 - - [28/Aug/2019 21:18:08] "POST /?chatwork_webhook_signature=CzpZzZWtH6XWfxRAa1BW9ejjWQxh43c3qPnXM/HS3/4%3D HTTP/1.1" 500 -

python

1 2#!/usr/bin/python 3# -*- coding: utf-8 -*- 4import json 5from zmq import Context, REQ 6from flask import Flask, request 7import re 8import pdb; 9 10 11def mains(msg): 12 context = Context() 13 print("Connecting to hello world server...") 14 socket = context.socket(REQ) 15 socket.connect("tcp://localhost:5555") 16 for i in range(1): 17 socket.send(msg) 18 message = socket.recv() 19 print("Received reply %s [ %s ]" % (i, message)) 20 21def jsonConversion(jsonStr): 22 data = json.loads(jsonStr) 23 return data 24 25app = Flask(__name__) 26 27@app.route("/", methods=['POST']) 28def webhook(): 29 msg = request.get_data() 30 res = jsonConversion(msg) 31 res2 = res['webhook_event']['body'].encode('shift-jis') 32 pdb.set_trace() 33 34 result = re.match(rb'[A-Z]{3}[/][A-Z]{3}',res2) 35 36 mains(result) 37 return msg 38 39if __name__ == "__main__": 40 app.run() 41 42

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

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

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

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

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

guest

回答1

0

ベストアンサー

提示ソースresult = re.match(rb'[A-Z]{3}[/][A-Z]{3}',res2)
エラー内のコードres2 = re.match(r'[A-Z]{3}[/][A-Z]{3}',res2)とが異なるのが気になりますが…

以下の方法1のようにrb'~'bytes型用の正規表現を指定、適用するか
方法2のように普通にstr型に対して正規表現を適用すればよいです。

Python

1import re 2 3src = 'USD/JPY' 4 5# 方法1:byte型のまま正規表現を適用する 6res2 = src.encode('shift-jis') 7result = re.match(rb'[A-Z]{3}[/][A-Z]{3}',res2) 8print(result) # <_sre.SRE_Match object; span=(0, 7), match=b'USD/JPY'> 9 10# 方法2:str型に対して普通に正規表現を適用する 11res2 = src 12result = re.match(r'[A-Z]{3}[/][A-Z]{3}', res2) 13print(result) # <_sre.SRE_Match object; span=(0, 7), match='USD/JPY'>

追記

socket.sendにはbytes型の引数を渡さなければならず、Match objectをそのまま渡すことはできません。
以下のようにマッチした部分を取得して渡すようにしてください。

Python

1src = 'USD/JPY' 2 3res2 = src.encode('shift-jis') 4result = re.match(rb'[A-Z]{3}[/][A-Z]{3}',res2) 5print(result) # <_sre.SRE_Match object; span=(0, 7), match=b'USD/JPY'> 6 7msg = result.group(0) 8print(msg) # b'USD/JPY'

投稿2019/08/28 13:28

編集2019/08/28 22:15
can110

総合スコア38256

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

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

yuujiMotoki

2019/08/28 21:15 編集

お世話になります。 エラーコードが違っている件ですが、途中解析中のものを張り付けてしまいました。 今回のエラーは、正規表現には問題ないことが分かりました。 どうやら、正規表現された resultのクラスは FLASKの引数にできない・・・ようなエラーを吐いていました。 つまり、class(re.Match)という型を、なんらか変換せよということなのですが (すこしタイトルとは、質問内容が変わってきたのですが、 このままで、先の回答を期待できるのであれば、しばらくこのまま 議論させて頂ければと思います) ‘‘‘python > <ipython-input-1-24aa6dcf04c0>(31)webhook() -> result = re.match(rb'[A-Z]{3}[/][A-Z]{3}',res2) (Pdb) res2 b'USD/JPY' (Pdb) n > <ipython-input-1-24aa6dcf04c0>(33)webhook() -> mains(result) (Pdb) result <re.Match object; span=(0, 7), match=b'USD/JPY'> (Pdb) n Connecting to hello world server... TypeError: <re.Match object; span=(0, 7), match=b'USD/JPY'> does not provide a buffer interface. > <ipython-input-1-24aa6dcf04c0>(33)webhook() -> mains(result) (Pdb) n --Return-- > <ipython-input-1-24aa6dcf04c0>(33)webhook()->None -> mains(result) (Pdb) result <re.Match object; span=(0, 7), match=b'USD/JPY'> (Pdb) type(result) <class 're.Match'> (Pdb) n TypeError: <re.Match object; span=(0, 7), match=b'USD/JPY'> does not provide a buffer interface. > c:\users\moto\anaconda3\lib\site-packages\flask\app.py(1799)dispatch_request() -> return self.view_functions[rule.endpoint](**req.view_args) ‘‘‘
can110

2019/08/28 22:05

コメント欄ではマークダウン表記が使えないので、質問本文を編集して追記ください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問