首页 / 知识
python中的反斜杠
2023-11-12 13:40:00
使用python写字符串常量时,rawstring是个很好用的东东,比如在C里我要写一个Windows下的路径,得这么
写:
char*path="C:\\mydir\\myfile.txt";
用"\\"来转义成一个反斜杠字符。而在python下用rawstring就不用这么麻烦了:
path=r"C:\mydir\myfile.txt"
一个r搞定,是不是很简单?
真的这么简单吗?未必。试试如果要指定一个目录名呢?
>>>path=r"C:\mydir\mysubdir\"
File"",line1
path=r"C:\mydir\mysubdir\"
^
SyntaxError:EOLwhilescanningsingle-quotedstring
出错了吧。
这是一个常见的陷阱,在使用rawstring时,反斜杠虽然不再做转义用,但它仍然保留了一部分“魔力”——保护字符串。如>>>printr"abc\"xyz"abc\"xyz
在反斜杠之后的那个引号由于反斜杠的魔力,不被视为字符串终结。那么对应到开头那个路径r"C:\mydir\mysubdir\",最后那个引号也是由于反斜杠的魔力,不被视为终结,python认为其后应该还有东西,结果没有,就报错了。
那岂不是用rawstring写Windows路径就很不方便了吗?
答案是:rawstring本来就不是为了方便写Windows路径而设计的,而是为了方便写正则表达式设计的。在正则表达式中,反斜杠是转义字符,因此不可能出现以反斜杠结尾的正则表达式。
Windows路径的“正统”写法应该是:
path=os.path.normcase("c:/mydir/mysubdir/")
os.path.normcase在Windows平台下会自动把正斜杠转换成反斜杠。
由于正则表达式使用反斜杠来转义特殊字符,而python自身处理字符串时,反斜杠也是用于转义字符,这样就产生了一个双重转换的问题,要匹配字符串中1个反斜杠应该怎么写正则表达式?"\\",这样行吗?试试就知道了,re模块抛异常了,因为"\\"就是一个反斜杠,对于正则表达式解析器来说,是一个转义字符,但是后面啥也没有,自然就报错了,"\\\"三个肯定是不行的,试试四个"\\\\",完美匹配。
viewplaincopytoclipboardprint?
importre
re_str_patt="\\\\"
reObj=re.compile(re_str_patt)
str_test="abc\\cd\\hh"
printreObj.findall(str_test)
importre
re_str_patt="\\\\"
reObj=re.compile(re_str_patt)
str_test="abc\\cd\\hh"
printreObj.findall(str_test)
输出:['\\','\\']
这里要这么理解,首先第一重转换是字符串自身的转义,那么"\\\\",实际上就是表示两个反斜杠(两个字符),然后传入正则表达式解析器,因为反斜杠依然是转义字符,那么进行第二重转换,两个反斜杠就代表一个反斜杠,所以就能和一个反斜杠进行匹配了,那么匹配连续的两个反斜杠,写正则表达式时就要写8次"\"了,相当壮观,要匹配/d+(这个在正则表达式里面表示连续1一个以上的数字字符)这个字符串怎么写呢?
viewplaincopytoclipboardprint?
importre
re_str_patt="\\\\d\\+"
printre_str_patt
reObj=re.compile(re_str_patt)
printreObj.findall("\\d+")
importre
re_str_patt="\\\\d\\+"
printre_str_patt
reObj=re.compile(re_str_patt)
printreObj.findall("\\d+")
写成re_str_patt="\\\\d\+"也行,因为\+对于字符串来说,没有转义意义,所以就当成一个反斜杠了。
在python中写正则表达式时用得最多的是raw字符串,原生字符串,什么意思?就是只有一重转换了,没有字符串转换了,只在正则表达式内部进行转换了,这样匹配一个反斜杠的正则表达式可以这样写,re_str_patt=r"\\",有人会想,以后写windows的文件路径什么的方便了,呵呵直接path=r"c:\myforder\xx"搞定,是的,这句没有问题,但是如果你写成path=r"c:\myforder\xx\",直接报错了,为什么?因为反斜杠虽然不作为转义字符了,但是还是对它后面的引号(包括单引号)有影响,使这个引号不被视为字符串的终止,以为它后面还有字符,但是实际没有,因此会报错。其实可以反过来想raw字符串里面要表示引号怎么办呢?,可以发现path=r"\\123\"xxx"是可以的,那用raw字符串岂不是有局限性?不过raw在设计之初就是用来支持正则表达式的,而在正则里面反斜杠是转义字符,所以不可能出现在字符串的末尾的,所以建议不要图方便在其他的地方使用raw。
以上内容为大家介绍了python中的反斜杠,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注我们http://www.mobiletrain.org/
最新内容
相关内容
python字符串截取?
python字符串截取?,代码,步长,位置,分析,字符串,字符,信息,灵活,数字,表示,在Python中,字符串是一种非常常见的数据类型,它可以用来表示文本、数大学生报名Python培训课程的好处是
大学生报名Python培训课程的好处是什么?,培训,企业,社会,项目,行业,工作,时间,技术,都会,素养,一、报名学习前沿技术在IT行业,技术在不断变化和线上Python培训和线下有什么不同?
线上Python培训和线下有什么不同?,培训,基础,实战,电脑,项目,教育,时间,地方,初级,技术,学习互联网技术的人越来越多,很多机构都采取线上和线下报名Python培训选择哪种方式比较好
报名Python培训选择哪种方式比较好?,培训,工作,基础,时间,情况,在线,最划算,环境,系统,方式,Python不仅是一种高级的编程语言,而且还是一种应用在Python培训中有哪些必学的运算符
在Python培训中有哪些必学的运算符?,项目,培训,数字,变量,赋值,符号,两个,表示,数学,示例,不论是Python还是其他后端编程语言,都少不了运算符的深圳python培训课程哪家靠谱?
深圳python培训课程哪家靠谱?,深圳,人工智能,培训,检测,分析,实战,行业,转型,时间,体系,Python语言简单、易学、易读、易维护,学习成本和时间相学习Python有必要报培训班吗?
学习Python有必要报培训班吗?,项目,培训,企业,实战,行业,技术,做好,汽车,行情,体系,伴随着人工智能的广泛应用,Python被广泛应用于web开发、运Python的异常处理
Python的异常处理,异常,代码,信息,数据,名字,语句,文件,检测,培训,发生,什么是异常?异常即是一个事件,该事件会在程序执行过程中发生,影响了程python与平台有关吗
python与平台有关吗,平台,一致,环境,代码,设计,项目,培训,语言,操作,二进制文件,Python与平台无关,因为Python是跨平台的语言,Python作为脚本语python之当前GIL设计的缺陷
python之当前GIL设计的缺陷,时间,代码,设计,线程,培训,受益,一致,平均,状态,持有,基于pcode数量的调度方式按照Python社区的想法,操作系统本身python字符串处理函数大总结
python字符串处理函数大总结,位置,数字,异常,培训,字符串,空格,长度,两边,字母,函数,str=pythonStringfunction生成字符串变量str=pythonStripython字符串处理相关函数
python字符串处理相关函数,数字,培训,通用,字符串,字符,函数,字母,模块,标号,空格,python中字符串中字符大小写的变换:*S.lower()#小写*S.uppe