设为首页 收藏本站
查看: 894|回复: 0

[经验分享] python原生字符的使用

[复制链接]

尚未签到

发表于 2018-8-10 09:32:36 | 显示全部楼层 |阅读模式
  这里是一点小心得:由于下面两个原因,在正则表达式中使用反斜杠就会产生了一个双重转换的问题。
  (1)、python自身处理字符串时,反斜杠是用于转义字符
  (2)、正则表达式也使用反斜杠来转义字符
  要匹配字符串中1个反斜杠应该怎么写正则表达式?"\\",这样行吗?试试就知道了,re模块抛异常了,因为在正则表达式中,"\\"就是一个反斜杠,对于正则表达式解析器来说,是一个转义字符,但是后面啥也没有,自然就报错了,"\\\"三个肯定是不行的,试试四个"\\\\",完美匹配。
  代码如下:
  import re
  re_str_patt =
"\\\\"
  reObj = re.compile(re_str_patt)
  str_test = "abc\\cd\\hh"
  print
reObj.findall(str_test)
  输出['\\',
'\\']
  备注:
  1、第二行代码只使用了python非原生字符串,所以它在正则表达式中表示的是一个反斜杠。(即四合一)
  2、由于python字符串中,反斜杠表示转义,所以第四行代码中的字符串表示的是:
  abc后是一个反斜杠,然后接cd,再接一个反斜杠,然后是hh
  3、代码段输出的是一个列表,列表中有两个元素。每一个元素都是一个字符串(python中的字符串),
  所以列表的第一个元素实际是表示一个反斜杠,同样,列表的第二个元素也是表示一个反斜杠。
  4、输出也可能是这样的:[r'\',
r'\'] 两种输种输出效果是一致的。
  代码如下改动:
  import re
  re_str_patt = r"\\\\"
  reObj =
re.compile(re_str_patt)
  str_test = "abc\\cd\\hh"
  print
reObj.findall(str_test)
  输出:[]
  备注: 1、第二行代码改成了原生字符串,此时正则表达式要匹配的则是两个连续的反斜杠。(即二合一)
  2、第四行代码中的字符串表示的是:abc后是一个反斜杠,然后接cd,再接一个反斜杠,然后是hh。
  3、所以没有匹配的内容,输出为一个空列表。
  对于第一段代码要这么理解,首先第一重转换是字符串自身的转义,那么"\\\\",实际上就是表示两个反斜杠(两个字符),然后传入正则表达式解析器,因为反斜杠依然是转义字符,那么进行第二重转换,两个反斜杠就代表一个反斜杠,所以就能和一个反斜杠进行匹配了,那么匹配连续的两个反斜杠,写正则表达式时就要写8次"\"了,相当壮观。\d+在正则表达式里面表示匹配连续1一个以上的数字字符,可是如果想匹配:一个反斜杠,后接字母d,再接一个加号 ,这个字符串怎么写呢?(答案:"\\\\d\\+")
  代码如下:
  import re
  re_str_patt = "\\\\d\\+"
  print
re_str_patt
  reObj = re.compile(re_str_patt)
  print reObj.findall("\\d+")
  输出:\\d\+
  ['\\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。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-549499-1-1.html 上篇帖子: python实现FTP上传下载 下篇帖子: python中文转换url编码(转)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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