【python】原始字符串末尾的反斜杠

转载自http://blog.sina.com.cn/s/blog_e8b9fffc0102vh3i.html
在Python中,可以直接对变量进行赋值,如果是个字符串就用双引号或者单引号括起来。现在遇到下面的问题,我对变量str进行赋值,给予了一个路径,发现用print打印的时候,出现了换行的现象。原来是Python把\n当做了一个回车。如下:

>>>str = 'C:\new\aaa\bbb'
>>>str
'C:\new\aaa\bbb'
>>>print(str)
C:
ew\aaa\bbb

之后,我找到了解决方法,如下:

>>>str = r'C:\new\aaa\bbb'
>>>str
'C:\\new\\aaa\\bbb'
>>>print(str)
C:\new\aaa\bbb

使用原始字符串。在字符串之前,在引号之前,加了一个小r,成功的解决了问题。但是,在我想输入r’C:\new\aaa\bbb’的时候,又遇到了错误:

>>>str = r'C:\new\aaa\bbb\'
SyntaxError: EOL while scanning string literal

遇到这个情况,我的第一反应是在最后的\前面加一个转义字符\,结果发现,并不是我想的那样:

>>>str = r'C:\new\aaa\bbb\\'
>>>print(str)
C:\now\aaa\bbb\\

竟然在后面多了一个\,并没有实现转义字符的功能!我又想了一个方法,把最后的\用双引号括起来:

>>>str = r'C:\new\aaa\bbb"\"'
>>>str
'C:\\new\\aaa\\bbb"\\"'
>>>print(str)
C:\now\aaa\bbb"\"

事实竟然是如此的惨烈,我甚至开始怀疑这是不是Python的一个bug!

经过查阅多方资料,终于发现了问题所在:
字符串的末尾,即使是原始(raw)字符串末尾也不能带奇数个反斜杠,因为这会引起后续引号的转义!

比如r’C:\Windows’这个字符串常量,后一个反斜杠会告诉解析器后面的单引号不是字符串的结尾,字符串由两个引号包围,少了一个引号结束字符串,所以出现"SyntaxError: EOL while scanning single-quoted string “这个错误;这说明原始字符串也不是100%的"raw”,它影响字符串的开头和结尾,下面举几个例子:
r’C:\Windows’new’不是有效的字符串,前部分r’C:\Windows’已经是合法的字符串了,后面加上new’解析失败;
r’C:\Windows’\new’也会出错,错误原因同上,合法字符串r’C:\Windows’加上\new’让解析器解析失败;
r’C:\Windows’new’不会出错,很多人理解的原始字符串会保留字符本来的意义,所以会认为字符串中 r’C:\Windows’已经是一个合法的字符串了,后面还跟着new’使得字符串不合法,其实这个字符串中 r’C:\Windows’不合法,应为后面的反斜杠告诉解析器"我后面的引号的意义已经被我转义了,在这里不是字符串的结尾,你可以继续进行解析"。
下面提供3个解决办法:

>>>str = r'C:\new\aaa\bbb\\'[:-1]
>>>str
'C:\\new\\aaa\\bbb\\'
>>>print(str)
C:\now\aaa\bbb\

这个方法是是使用了string[:-n],string是一个字符串,[]中的±来控制方向,-是从右向左,+是从左向右。n就是一个数字,[:-1]也就是表示打印从第一个到倒是第一个字符,其中倒数第一个字符不打印!
看上面那个例子,如果没有[:-1]来控制的话,用print会打印出来两个\!

>>>str = r'C:\new\aaa\bbb'+'\\'
>>>str
'C:\\new\\aaa\\bbb\\'
>>>print(str)
C:\now\aaa\bbb\

我个人觉得这个方法是最好的,把两个字符串合并,很容易看懂。

>>>str = 'C:\\new\\aaa\\bbb\\'
>>>str
'C:\\new\\aaa\\bbb\\'
>>>print(str)
C:\now\aaa\bbb\

这个方法就比较笨了,在每一个\前,都加了一个转义字符。如果路径很长的话,非常得不适用!

  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值