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

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

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

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

3回答

1661閲覧

文字列から任意のエスケープ文字を検索する

N-B-I

総合スコア12

Python 3.x

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2020/05/16 09:16

編集2020/05/16 16:18

経緯

Windowsのエクスプローラから得られる
'C:\foo\bar'
といったpathをpythonで扱うためには、
'C:\foo\bar'
としなければなりませんが、手入力で修正するのは手間なので
'C:\foo\bar'を渡すと'C:\foo\bar'を返す関数を書きたかったのです。

TODO

  1. 文字列を1文字ずつリストに解体し、'\'を含む値に、'\'を加えてインプレースして変更すればよいと考えました。
  2. '\'単体で加算しようとすると'がエスケープされてしまうので'\'
  3. しかし'C:\foo\bar'が含むのは'\'そのものではなく「エスケープされたf」と「エスケープされたb」です。
  4. また、当然ながら必ずしも「エスケープされたf」…等ではなく「エスケープされた任意の文字」を検索しなければならないので、正規表現のワイルドカードを用いることにしました。

quiquiさんより「path_pyの引数をどうやって得るか」2020/05/17 0:45 追記

python3

1raw_path = input() # 「手動」でコピペ 2path_py(raw_path)

実装、しかし...

python3

1import re 2 3def path_py(path_win): 4 fragmented = [] 5 for letter in path_win: 6 fragmented.append(letter) 7 8 regex_escape = re.compile(r'\.') # エスケープされた'\'とワイルドカード 9 10# 後略

よし、これでリストの値を順番にregex_escape.search()してオブジェクトが!=Noneなら...
アレ...?
僕が検索したかったのは任意のエスケープ文字(1文字)です。
エスケープと任意の文字(2文字)ではありません。
ましてやr'.'(エスケープされたワイルドカード、すなわちただのピリオド1文字)でもありません。
どうすればよいのでしょう...

解決後記

pepperleafさんのご回答まんまでした。
まとめてになりますが皆様ご回答ありがとうございます。

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

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

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

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

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

quickquip

2020/05/16 10:14

後略に書いてあるはずの「path_pyの引数をどうやって得るか」の部分が核心ではないかと。
N-B-I

2020/05/16 16:13

説明不足でした、すみません
guest

回答3

0

ベストアンサー

'C:\foo\bar' と表記するのは、コード上に直接、文字列を記載した場合で、
文字列として渡される場合の 'C:\foo\bar' は、そのままで、問題ないです。

ソースコードに直接、書かれた 'C:\foo\bar' は、\f, \b がエスケープ文字となり、C: + \f + oo + \b + ar となっています。多分、ソースコードでの表記と、文字列がごっちゃになってる気がします。

投稿2020/05/16 09:37

pepperleaf

総合スコア6383

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

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

0

Python

1def fnc(s): 2 s = ''.join(list(repr(s))) 3 return s 4 5print(fnc('C:\foo\bar')) 6# 'C:\foo\bar'

投稿2020/05/16 09:41

編集2020/05/16 10:36
ForestSeo

総合スコア2720

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

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

0

目的と手段が入れ替わっていませんか。

python

1s = 'C:\foo\bar'

としたときに、fbがエスケープされるのを何とかしたいということでしょうけれど
それならばraw文字列でよいのでは?

python

1s = r'C:\foo\bar'

投稿2020/05/16 09:27

SHOMI

総合スコア4079

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問