鱼C论坛

 找回密码
 立即注册
查看: 55|回复: 4

[已解决]原始字符串的结尾处如果是反斜杠,方法1好像行不通,请大神指点

[复制链接]
发表于 7 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
例如想表示D:\Program Files\Python 3.8\

由于Python 原始字符串中的反斜杠仍然会对引号进行转义,因此原始字符串的结尾处不能是反斜杠,否则字符串结尾处的引号会被转义,导致字符串不能正确结束。

>>> str1 = 'D:\Program Files\Python 3.8\'
SyntaxError: EOL while scanning string literal
>>> str1 = r'D:\Program Files\Python 3.8\'
SyntaxError: EOL while scanning string literal

在 Python 中有两种方式解决这个问题:

方式1:不要使用原始字符串,改用长字符串的写法;

>>> str1 = '''D:\Program Files\Python 3.8\'''
(重启IDLE)
>>> str1 = '''
D:\Program Files\Python 3.8\
'''
>>> print(str1)

D:\Program Files\Python 3.8 # 结尾缺少\

方式2:使用原始字符串,同时单独书写反斜杠---这是接下来要重点说明的。

1.str1 = r'D:\Program Files\Python 3.8' '\\'
2.print(str1)

我们先写了一个原始字符串r'D:\Program Files\Python 3.8',紧接着又使用'\\'写了一个包含转义字符的普通字符串,Python 会自动将这两个字符串拼接在一起,所以上面代码的输出结果是:

D:\Program Files\Python 3.8\
最佳答案
7 天前
本帖最后由 阿奇_o 于 2022-11-25 14:10 编辑

路径问题,担心拼接错误的,就尽量用 os.path.join(...)  即可 。

结尾从反斜杠的问题,是因为 它先处理了 单引号成对与否的语法检查,而不是先处理 r-string 这个功能 。 (其实你加不加 r ,如果最后带一个反斜杠都会通不过语法检查)
反斜杠是"转义字符",escape ,  反斜杠让紧接的 单引号,不再是匹配前面的单引号,而是其本身,作为字符串一部分。
所以它会报语法错误,说你  unterminated string literal  未正确终结文本字符, 就是因为它会先检查 引号,括号等这些成对的特殊符号 匹配语法。


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 7 天前 From FishC Mobile | 显示全部楼层
  1. str1 = r'D:\Program Files\Python 3.8' + '\\'
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 7 天前 | 显示全部楼层

谢谢大神

(1)你的写法str1 = r'D:\Program Files\Python 3.8' + '\\',或我提到的str1 = r'D:\Program Files\Python 3.8' '\\'

经测试,以上两种都可实现print(str1)的输出结果为D:\Program Files\Python 3.8\

(2)方式1在http://c.biancheng.net/view/4227.html有提到,但作者并未列明代码,我自己测试好像行不通,不知道是否原文作者有误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 7 天前 | 显示全部楼层
lzb1001 发表于 2022-11-25 08:28
谢谢大神

(1)你的写法str1 = r'D:\Program Files\Python 3.8' + '\\',或我提到的str1 = r'D:\Progr ...

那个不是为了将反斜杠写入字符串中,而是表示这一行的语句没有结束,和下一行语句是连在一起的。就比如,
  1. x = "hello"
复制代码
  1. x = "h\
  2. ell\
  3. o"
复制代码
的效果是一样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 7 天前 | 显示全部楼层    本楼为最佳答案   
本帖最后由 阿奇_o 于 2022-11-25 14:10 编辑

路径问题,担心拼接错误的,就尽量用 os.path.join(...)  即可 。

结尾从反斜杠的问题,是因为 它先处理了 单引号成对与否的语法检查,而不是先处理 r-string 这个功能 。 (其实你加不加 r ,如果最后带一个反斜杠都会通不过语法检查)
反斜杠是"转义字符",escape ,  反斜杠让紧接的 单引号,不再是匹配前面的单引号,而是其本身,作为字符串一部分。
所以它会报语法错误,说你  unterminated string literal  未正确终结文本字符, 就是因为它会先检查 引号,括号等这些成对的特殊符号 匹配语法。


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1

GMT+8, 2022-12-2 08:33

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表