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

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

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

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

Q&A

解決済

2回答

1751閲覧

Python3 エスケープ文字()から始まる単語を指定する

HAGI-04

総合スコア3

Python 3.x

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

0グッド

0クリップ

投稿2019/08/08 16:01

編集2019/08/10 02:20

python3で以下の文章から、エスケープ文字「\」から始まるエスケープシーケンス(改行\nなど)をすべて削除しようと思い、以下のように実行しました。
(anaconda3のjupyter notebookを使っています)

corpus

1私達は、エンジニアが抱える問題の解決を全力でサポートします。 2質問・回答によって 生まれたコンテンツを、同じ問題を持った人に最適な形で届けます。 3 4プログラミングに関して、わからないことがあれば是非teratailで質問してください。 5あなたがわかることがあれば、是非解決方法をシェアして解決の手助けをしてください。 6 7あなたの全ての行動が、いつか多くの日本のエンジニアの為になります。

python

1from janome.tokenizer import Tokenizer 2 3t = Tokenizer() 4 5# ファイルをオープンする 6corpus_text = open("corpus.txt", "r") 7 8# すべての内容を読み込む 9corpus = corpus_text.read() 10 11# ファイルをクローズする 12corpus_text.close() 13 14# 分かち書きにする 15tmp= t.tokenize(corpus, wakati = True) 16 17print(tmp) 18 19print('='*50) 20 21# 空白を消す 22word_list = [word for word in tmp if not (word.startswith('\'))] 23 24print(word_list)

output

1['私', '達', 'は', '、', 'エンジニア', 'が', '抱える', '問題', 'の', '解決', 'を', '全力', 'で', 'サポート', 'し', 'ます', '。', '\n', '質問', '・', '回答', 'によって', ' ', '生まれ', 'た', 'コンテンツ', 'を', '、', '同じ', '問題', 'を', '持っ', 'た', '人', 'に', '最適', 'な', '形', 'で', '届け', 'ます', '。', '\n\n', 'プログラミング', 'に関して', '、', 'わから', 'ない', 'こと', 'が', 'あれ', 'ば', '是非', 'teratail', 'で', '質問', 'し', 'て', 'ください', '。', '\n', 'あなた', 'が', 'わかる', 'こと', 'が', 'あれ', 'ば', '、', '是非', '解決', '方法', 'を', 'シェア', 'し', 'て', '解決', 'の', '手助け', 'を', 'し', 'て', 'ください', '。', '\n\n', 'あなた', 'の', '全て', 'の', '行動', 'が', '、', 'いつか', '多く', 'の', '日本', 'の', 'エンジニア', 'の', '為', 'に', 'なり', 'ます', '。'] 2================================================== 3['私', '達', 'は', '、', 'エンジニア', 'が', '抱える', '問題', 'の', '解決', 'を', '全力', 'で', 'サポート', 'し', 'ます', '。', '\n', '質問', '・', '回答', 'によって', ' ', '生まれ', 'た', 'コンテンツ', 'を', '、', '同じ', '問題', 'を', '持っ', 'た', '人', 'に', '最適', 'な', '形', 'で', '届け', 'ます', '。', '\n\n', 'プログラミング', 'に関して', '、', 'わから', 'ない', 'こと', 'が', 'あれ', 'ば', '是非', 'teratail', 'で', '質問', 'し', 'て', 'ください', '。', '\n', 'あなた', 'が', 'わかる', 'こと', 'が', 'あれ', 'ば', '、', '是非', '解決', '方法', 'を', 'シェア', 'し', 'て', '解決', 'の', '手助け', 'を', 'し', 'て', 'ください', '。', '\n\n', 'あなた', 'の', '全て', 'の', '行動', 'が', '、', 'いつか', '多く', 'の', '日本', 'の', 'エンジニア', 'の', '為', 'に', 'なり', 'ます', '。']

出力からわかるように、リスト中の'\n'や'\n\n'などが削除されることを期待していましたが、削除はされていませんでした。
なぜこのコードは正しく機能しないのでしょうか?
また、どうすれば「¥」から始まる文字列を指定できるでしょうか?


追記

以下のように一度raw文字列に直すことで""から始まるエスケープシーケンスを検出できました。
raw文字列に直した際、各単語は「''」で囲まれていたので、「'\」から始まる単語を排除するように書いています。

python

1# 分かち書きにする 2tmp= t.tokenize(corpus, wakati = True) 3 4print(tmp) 5 6print('='*50) 7 8#エスケープシーケンスを削除する 9word_list = [] 10for word in tmp: 11 if not repr(word).startswith('\'\'): 12 word_list.append(word) 13 14print(word_list)

output

1['私', '達', 'は', '、', 'エンジニア', 'が', '抱える', '問題', 'の', '解決', 'を', '全力', 'で', 'サポート', 'し', 'ます', '。', '\n', '質問', '・', '回答', 'によって', ' ', '生まれ', 'た', 'コンテンツ', 'を', '、', '同じ', '問題', 'を', '持っ', 'た', '人', 'に', '最適', 'な', '形', 'で', '届け', 'ます', '。', '\n\n', 'プログラミング', 'に関して', '、', 'わから', 'ない', 'こと', 'が', 'あれ', 'ば', '是非', 'teratail', 'で', '質問', 'し', 'て', 'ください', '。', '\n', 'あなた', 'が', 'わかる', 'こと', 'が', 'あれ', 'ば', '、', '是非', '解決', '方法', 'を', 'シェア', 'し', 'て', '解決', 'の', '手助け', 'を', 'し', 'て', 'ください', '。', '\n\n', 'あなた', 'の', '全て', 'の', '行動', 'が', '、', 'いつか', '多く', 'の', '日本', 'の', 'エンジニア', 'の', '為', 'に', 'なり', 'ます', '。'] 2================================================== 3['私', '達', 'は', '、', 'エンジニア', 'が', '抱える', '問題', 'の', '解決', 'を', '全力', 'で', 'サポート', 'し', 'ます', '。', '質問', '・', '回答', 'によって', ' ', '生まれ', 'た', 'コンテンツ', 'を', '、', '同じ', '問題', 'を', '持っ', 'た', '人', 'に', '最適', 'な', '形', 'で', '届け', 'ます', '。', 'プログラミング', 'に関して', '、', 'わから', 'ない', 'こと', 'が', 'あれ', 'ば', '是非', 'teratail', 'で', '質問', 'し', 'て', 'ください', '。', 'あなた', 'が', 'わかる', 'こと', 'が', 'あれ', 'ば', '、', '是非', '解決', '方法', 'を', 'シェア', 'し', 'て', '解決', 'の', '手助け', 'を', 'し', 'て', 'ください', '。', 'あなた', 'の', '全て', 'の', '行動', 'が', '、', 'いつか', '多く', 'の', '日本', 'の', 'エンジニア', 'の', '為', 'に', 'なり', 'ます', '。']

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

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

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

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

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

tiitoi

2019/08/08 16:08

手元の環境ではうまくいきましたが、tmp にそもそも \ で始まる文字列があるのでしょうか。\ ではない別の文字だったりはしないですか(全角の¥など)
HAGI-04

2019/08/08 16:33 編集

質問を編集しました。 消したい文字は全角の「¥」などではなく、確かにバックスラッシュだと思うのですが...
guest

回答2

0

消したい文字は全角の「¥」などではなく、確かにバックスラッシュだと思うのですが...

\n はこれで1つの改行を表す特殊文字で実際に<スラッシュ>n という文字列を表しているわけではありません。
表示する際に \n という文字で表されているだけです。(つまり、見た目の問題)

\n含まれない 文字だけ残したい場合は次のようにしてください。

python

1text = ['私', '達', 'は', '、', 'エンジニア', 'が', '抱える', '問題', 'の', '解決', 'を', '全力', 'で', 'サポート', 'し', 'ます', '。', '\n', '質問', '・', '回答', 'によって', ' ', '生まれ', 'た', 'コンテンツ', 'を', '、', '同じ', '問題', 'を', '持っ', 'た', '人', 'に', '最適', 'な', '形', 'で', '届け', 'ます', '。', '\n\n', 'プログラミング', 'に関して', '、', 'わから', 'ない', 'こと', 'が', 'あれ', 'ば', '是非', 'teratail', 'で', '質問', 'し', 'て', 'ください', '。', '\n', 'あなた', 'が', 'わかる', 'こと', 'が', 'あれ', 'ば', '、', '是非', '解決', '方法', 'を', 'シェア', 'し', 'て', '解決', 'の', '手助け', 'を', 'し', 'て', 'ください', '。', '\n\n', 'あなた', 'の', '全て', 'の', '行動', 'が', '、', 'いつか', '多く', 'の', '日本', 'の', 'エンジニア', 'の', '為', 'に', 'なり', 'ます', '。'] 2 3word_list = [word for word in text if "\n" not in word] 4print(word_list) 5# ['私', '達', 'は', '、', 'エンジニア', 'が', '抱える', '問題', 'の', '解決', 'を', '全力', 'で', 'サポート', 'し', 'ます', '。', '質問', '・', '回答', 'によって', ' ', '生まれ', 'た', 'コンテンツ', 'を', '、', '同じ', '問題', 'を', '持っ', 'た', '人', 'に', '最適', 'な', '形', 'で', '届け', 'ます', '。', 'プログラミング', 'に関して', '、', 'わから', 'ない', 'こと', 'が', 'あれ', 'ば', '是非', 'teratail', 'で', '質問', 'し', 'て', 'ください', '。', 'あなた', 'が', 'わかる', 'こと', 'が', 'あれ', 'ば', '、', '是非', '解決', '方法', 'を', 'シェア', 'し', 'て', '解決', 'の', '手助け', 'を', 'し', 'て', 'ください', '。', 'あなた', 'の', '全て', 'の', '行動', 'が', '、', 'いつか', '多く', 'の', '日本', 'の', 'エンジニア', 'の', '為', 'に', 'なり', 'ます', '。']

投稿2019/08/08 16:38

tiitoi

総合スコア21956

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

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

tiitoi

2019/08/08 16:39

すいません。重複しました。
HAGI-04

2019/08/08 16:59

丁寧な回答、誠にありがとうございました。 2件の回答、どちらも参考になりましたので、申し訳ありませんが投稿時間が早い方をBAとさせていただきました。
guest

0

ベストアンサー

エスケープが付く文字は表示は\nだったりしますが、文字列として\から始まっている訳ではありません。そのコードで"\n"は除去できても"\n"は除去できません。

個別に除去するものを選択するしかないでしょう。

python

1word_list = [word for word in tmp if "\n" not in word and "\t" not in word]

正規表現とかを使うと多少スマートかもしれません。

python

1import re 2 3pattern = r"[\n\t]" 4 5word_list = [word for word in tmp if pattern.search(word) is None] 6

実際にはPythonのエスケープシーケンスは色々あるので、そしてこれをすべてチェックしようとすると難しいので、厳密にやろうとするといろいろ大変です。

https://docs.python.org/ja/3/reference/lexical_analysis.html#literals

投稿2019/08/08 16:37

編集2019/08/08 16:42
hayataka2049

総合スコア30933

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

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

HAGI-04

2019/08/08 16:55

回答ありがとうございました。 自然言語処理に使う予定だったので出現しうるあらゆるエスケープシーケンスを除去できるようにしたかったため個別の選択は避けたかったのですが、難しいなら仕方ありませんね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問