2017-08-06 10 views
-1

私は以下のコードを書かれている:Pythonの "Re"モジュールは特別な言語に敏感ですか?

def process_file_step(message): 
chat_id = message.chat.id 
search = message.text 
pattern = re.compile(u'.*%s.*\.pdf' %re.escape(search), re.I) 
if next(filter(pattern.search, os.listdir('Files')), False): 
    bot.send_chat_action(chat_id, 'typing') 
    bot.send_message(chat_id, 'فایل هایی که نیاز داشتید :') 
    for files in filter(pattern.search, os.listdir('Files')): 
     requested_file = open('Files/' + files, 'rb') 
     bot.send_chat_action(chat_id, 'upload_document') 
     bot.send_document(chat_id, requested_file, caption='@RavanPediaBot') 
     requested_file.close() 
else: 
    bot.send_chat_action(chat_id, 'typing') 
    bot.send_message(chat_id, 'چنین سندی وجود ندارد !') 
bot.register_next_step_handler(bot.send_message(chat_id, 'درخواست دیگری دارید ؟', reply_markup=process_request_step_markup), process_request_step) 

これは、ユーザー用のファイルアップロードでは、それに似た名前のユーザーと検索から文字列を取得します。それは素晴らしいですが、それは問題がペルシャ語のために働かないということです、それは常にファイルが存在しないというメッセージを送信します。そして、私はコンピュータでスクリプトを実行するときにもペルシア語の名前のために働くが、私はcodeanywhere.comスクリプトを実行するために、動作しません。私はpyTelegramBotAPIを使用します。また、私はPython 3.xを使用します。関数のパラメータからテキストを取得します。また、私は&を使って検索文字列をエスケープしましたが、うまくいきませんでした。

Iは、ペルシャメッセージを印刷し、このエラーがトリガ:

UnicodeEncodeErrorを: 'ASCII' コーデックは位置0-3の文字をエンコードすることができない。序ない範囲で(128)

+1

でなければなりません。検索パターンをエスケープすることから始めます: '。*%s。* \。pdf '%re.escape(search)'。以来、今では正規表現を書くことができます。 –

+1

標準libのpathlibモジュールの新しいPathクラスを見てください。グロブマッチは非常に簡単に行うことができます: 'Path(" Files ")。glob(" * {} * .pdf ".format(search))' – PaulMcG

+0

@WillemVanOnsemありがとうございましたが、うまくいかなかった... –

答えて

1

をこれはおそらくエンコードの問題:コマンドラインからsearchを取得していますが、そのエンコーディングが検索しているファイルのエンコーディングと一致していますか?使用しているどのようなオペレーティングシステム?:のLinux/Unixの/ OSXは、一般的に、シェル入力用のUTF-8を使用していますが、Windowsは、通常、デフォルトでalmost the same... but not quiteあるエンコーディングをCP-1252を使用しています

  • 。あなたのinput_encodingが何であるか知っていなければなりませんし、それをUnicodeにデコードして動作させる必要があります:unicode_search = search.decode(input_encoding, "strict")
  • Python 3はどのバージョンのUTF-8文字列を使用しますか?but Python 2 doesn't;その場合には、force the regex string into being Unicodeはリテラルu'string'を使用して:pattern = re.compile(u'.*%s.*\.pdf' %search, re.I)
  • あなたはPythonの2を使用している場合、あなたはre.compile(..)ステートメントにre.UNICODEを渡す必要があります。
  • 最後に、入力を逃しているわけではありません。 ?は、実際の疑問符と一致するのではなく、前の文字の条件式として扱われます。あなたの最初の行はsearch = re.escape(args[0])
+0

@erranlinguist私は電文からユーザテキストを取得します... –

+0

それはあなたの 'args'変数に何が入るのか分からずに見つけなければならないものです。テレグラムからデータを取得する方法を知っています。 – errantlinguist

+0

私はコードを入れます... –

関連する問題