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

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

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

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

Q&A

解決済

3回答

2247閲覧

Pythonで\を使わずにエスケープシーケンスを無効化するには

y20190719

総合スコア12

Python 3.x

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

0グッド

1クリップ

投稿2019/08/05 06:56

Pythonで文字列リテラル'...', "..."の前にrまたはRをつけると、
エスケープシーケンスを展開せずそのままの値が文字列となる。
ということですが、
例えば、
x="t67890-^"
は、EOL while scanning string literalというエラーになり、
\を\にして
x="t67890-^"
とすればエラーにはならなくなります。
これを、\を使わずにr" "を使えば、
\は単なる文字列として解釈されるのでエラーにならないように思うのですが、
x=r"t67890-^"
としてみても、
EOL while scanning string literalというエラーになります。
なぜでしょうか。
\を使わずにエラーにならないようにするには、
どのように記述すればよいでしょうか。
(" "の中が変化するため、" "全体でエスケープを無効化したいです)
(Windows10,Python 3.7.3)

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

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

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

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

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

guest

回答3

0

諦めてr"t67890-^\"と書くしか無いです。

###なぜ raw 文字列 (r-strings) はバックスラッシュで終わってはいけないのですか?

正確には、奇数個のバックスラッシュで終わってはいけません。終わりの対になっていないバックスラッシュは、閉じ引用文字をエスケープし、終っていない文字列を残してしまいます。

...中略

Python

dir = r"\this\is\my\dos\dir" ""
dir = r"\this\is\my\dos\dir\ "[:-1]
dir = "\this\is\my\dos\dir"

引用元: デザインと歴史 FAQ — Python 3.7.4 ドキュメント

投稿2019/08/05 07:01

編集2019/08/05 07:06
LouiS0616

総合スコア35660

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

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

maisumakun

2019/08/05 07:03

r"t67890-^\"としたら、本当にバックスラッシュ2つになってしまいませんか?
LouiS0616

2019/08/05 07:05

そのとおりですね。ご指摘ありがとうございます。 リンク先に代替案があるのでそれを引用するように修正しておきます。
hayataka2049

2019/08/05 07:48

>raw 文字列は、独自にバックスラッシュの処理をしようとするプロセッサ (主に正規表現エンジン) への入力を生成しやすいように設計されたものです。このようなプロセッサは、終端の対になっていないバックスラッシュを結局エラーとみなすので、raw 文字列はそれを認めません。 もっともらしいけどそもそも普通の文字列リテラルでも同じ挙動な訳で、そんなに字句解析の実装に凝ってないだけなんじゃという気しかしないやつですね。
LouiS0616

2019/08/05 07:59

> Windows のパス名を構築するときには、Windows のシステムコールは普通のスラッシュも受け付けることを憶えておいてください ともありますし、解析を複雑にする動機が薄いのでしょうね。
guest

0

ベストアンサー

\を使わずにエラーにならないようにするには、

どのように記述すればよいでしょうか。

残念ながら、方法はありません。

r"\" は無効な文字列リテラルです (raw リテラルを奇数個連なったバックスラッシュで終わらせることはできません)。 - Python 3.7.4マニュアルより

投稿2019/08/05 06:59

maisumakun

総合スコア145184

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

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

y20190719

2019/08/06 23:16

「デザインと歴史 FAQ — Python 3.7.4 ドキュメント」や「Python 3.7.4マニュアルより」のリンク先の説明では、 「raw文字列は、バックスラッシュで終わってはいけない。正確には、奇数個のバックスラッシュで終わってはいけない。この理由は、終わりの対になっていないバックスラッシュは、 閉じ引用文字をエスケープし、終っていない文字列を残してしまうため」 と説明されていますが、 raw文字列は、エスケープされないはずなのに、エスケープされることを前提とした説明になっているところに矛盾を感じます。 raw 文字列を、バックスラッシュでエスケープしてしまうプロセッサ (主に正規表現エンジン)で処理しているところに問題があるような気がします。 でも、実際にこのようになってしまっているのでこのルールに従うしかありません。 ありがとうございました。
maisumakun

2019/08/06 23:20

ほかのコメントに付いているように、「構文解析が通常のエスケープする文字列と同じになっている」という実装の都合かと思われます。
guest

0

下記記述は間違っていました。すみません。

~~replaceなどを使って、事前に「\」を「\」に変換すれば良いかと思います。
~~

python

1a="ab\cd\e" 2b=a.replace('\','\') 3#'ab\cd\e'

投稿2019/08/05 09:42

編集2019/08/05 10:59
meg_

総合スコア10580

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

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

LouiS0616

2019/08/05 09:51

何も変わりないのでは。 >>> a = "ab\cd\e" >>> b = a.replace('\', '\') >>> a == b True
meg_

2019/08/05 10:53

ご指摘の通りでした。失礼しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問