エラー
環境
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でも同様のはず)