keep-loving-pythonのブログ

Pythonを愛し続けたいです(Pythonが流行っている限りですが。。。)

解決策(続編)。re.error: bad escape \s at position 0(多少、意味のある解読付き)

エラー

環境

windows10
pythonPython 3.10.11

エラー

re.error: bad escape \s at position 0

解決策

rをつけるとか、"\"を増やすとか。。。

検討したソース

import re

print(help(re.sub))
a = 'xyz_opqrstu_\s\t\c'
b = 'dummy'

print("===== yen 1 ====")
print("r-nashi-")
print("moto:",a)
# b = re.sub('\s','\s',a)
# re.error: bad escape \s at position 0
print(" ato:",b)

print("r-ari-")
print("moto:",a)
#b = re.sub('\s',r'\s',a)
#re.error: bad escape \s at position 0
print(" ato:",b)

print("===== yen 2 ====")
print("r-nashi-")
print("moto:",a)
#b = re.sub('\s','\\s',a)
#re.error: bad escape \s at position 0
print(" ato:",b)

print("r-ari-")
print("moto:",a)
b = re.sub('\s',r'\\s',a)
print(" ato:",b)
#moto: xyz_opqrstu_\s    \c
#ato: xyz_opqrstu_\s\s\c


print("===== yen 3 ====")
print("r-nashi-")
print("moto:",a)
b = re.sub('\s','\\\s',a)
print(" ato:",b)
#moto: xyz_opqrstu_\s    \c
# ato: xyz_opqrstu_\s\s\c


print("r-ari-")
print("moto:",a)
# b = re.sub('\s',r'\\\s',a)
# re.error: bad escape \s at position 2
print(" ato:",b)

↑どんどん"\"を足してみて下さい。3個周期???。

実行結果(すみません、print文が適切でないので、、、↑のコードのほうをみて欲しいです。)

===== yen 1 ====
r-nashi-
moto: xyz_opqrstu_\s    \c
 ato: dummy
r-ari-
moto: xyz_opqrstu_\s    \c
 ato: dummy
===== yen 2 ====
r-nashi-
moto: xyz_opqrstu_\s    \c
 ato: dummy
r-ari-
moto: xyz_opqrstu_\s    \c
 ato: xyz_opqrstu_\s\s\c
===== yen 3 ====
r-nashi-
moto: xyz_opqrstu_\s    \c
 ato: xyz_opqrstu_\s\s\c
r-ari-
moto: xyz_opqrstu_\s    \c
 ato: xyz_opqrstu_\s\s\c

解説

どうも、、、re.subの2つ目の引数は、
①最初に文字列としてエスケープ処理される。
②次に、その処理後の文字列の"\"付きの部分がエスケープできるかを判定する。で、"\s"とかは知りません!となる。
なぜか、できないならできないで良いという処理にならない!!!
上記の②の処理が、普通、理解不能だと思う、実装依存というか、実装都合なんでしょう!!!

補足2023/10/08

b = re.sub('\s',r'\\s',a)が良い姿 (python3.7でも同様のはず)