• 正则表达式 和 原生字符串 r


     

    使用python写字符串常量时,raw string是个很好用的东东,比如在C里我要写一个Windows下的路径,得这么
    写:

    char *path = "C:\mydir\myfile.txt";

    用""来转义成一个反斜杠字符。而在python下用raw string就不用这么麻烦了:

    path = r"C:mydirmyfile.txt"

    一个r搞定,是不是很简单?

    真的这么简单吗?未必。试试如果要指定一个目录名呢?

    >>> path = r"C:mydirmysubdir"
       File "<string>", line 1
         path = r"C:mydirmysubdir"
                                  ^
    SyntaxError: EOL while scanning single-quoted string

    出错了吧。

    这是一个常见的陷阱,在使用raw string时,反斜杠虽然不再做转义用,但它仍然保留了一部分“魔力”——保护字符串。如

    >>> print r"abc"xyz"
    abc"xyz

    在反斜杠之后的那个引号由于反斜杠的魔力,不被视为字符串终结。那么对应到开头那个路径r"C:mydirmysubdir",最后那个引号也是由于反斜杠的魔力,不被视为终结,python认为其后应该还有东西,结果没有,就报错了。

    那岂不是用raw string写Windows路径就很不方便了吗?

    答案是:raw string本来就不是为了方便写Windows路径而设计的,而是为了方便写正则表达式设计的。在正则表达式中,反斜杠是转义字符,因此不可能出现以反斜杠结尾的正则表达式。

    Windows路径的“正统”写法应该是:

    path = os.path.normcase("c:/mydir/mysubdir/")

    os.path.normcase在Windows平台下会自动把正斜杠转换成反斜杠。

    由于正则表达式使用反斜杠来转义特殊字符,而python自身处理字符串时,反斜杠也是用于转义字符,这样就产生了一个双重转换的问题,要匹配字符串中1个反斜杠应该怎么写正则表达式?"",这样行吗?试试就知道了,re模块抛异常了,因为""就是一个反斜杠,对于正则表达式解析器来说,是一个转义字符,但是后面啥也没有,自然就报错了,""三个肯定是不行的,试试四个"\",完美匹配。

    import re   
    re_str_patt = "\\" 
    reObj = re.compile(re_str_patt)   
    str_test = "abc\cd\hh" 
    print reObj.findall(str_test) 
    import re
    re_str_patt = "\\"
    reObj = re.compile(re_str_patt)
    str_test = "abc\cd\hh"
    print reObj.findall(str_test)
          输出:['\', '\']
      这里要这么理解,**首先第一重转换是字符串自身的转义,那么"\\",实际上就是表示两个反斜杠(两个字符),然后传入正则表达式解析器,因为反斜杠依然是转义字符,
    那么进行第二重转换,两个反斜杠就代表一个反斜杠,所以就能和一个反斜杠进行匹配了**,那么匹配连续的两个反斜杠,写正则表达式时就要写8次""了,相当壮观,
    要匹配/d+(这个在正则表达式里面表示连续1一个以上的数字字符)这个字符串怎么写呢?
    view plaincopy to clipboardprint?
    import re   
    re_str_patt = "\\d\+" 
    print re_str_patt   
    reObj = re.compile(re_str_patt)   
    print reObj.findall("\d+") 
    import re
    re_str_patt = "\\d\+"
    print re_str_patt
    reObj = re.compile(re_str_patt)
    print reObj.findall("\d+")
      写成re_str_patt = "\\d+"也行,因为+对于字符串来说,没有转义意义,所以就当成一个反斜杠了。
     在python中写正则表达式时用得最多的是raw字符串,**原生字符串,什么意思?就是只有一重转换了,没有字符串转换了,只在正则表达式内部进行转换了**,
    这样匹配一个反斜杠的正则表达式可以这样写,re_str_patt =r"\",有人会想,以后写windows的文件路径什么的方便了,呵呵直接 path = r"c:myforderxx"搞定,
    是的,这句没有问题,但是如果你写成 path =r"c:myforderxx",直接报错了,为什么?因为反斜杠虽然不作为转义字符了,但是还是对它后面的引号(包括单引号)有影响,
    使这个引号不被视为字符串的终止,以为它后面还有字符,但是实际没有,因此会报错。其实可以反过来想raw字符串里面要表示引号怎么办呢?,
    可以发现 path= r"\123"xxx" 是可以的,那用raw字符串岂不是有局限性?不过raw在设计之初就是用来支持正则表达式的,而在正则里面反斜杠是转义字符,
    所以不可能出现在字符串的末尾的,所以建议不要图方便在其他的地方使用raw。
  • 相关阅读:
    关于网购心态
    c++ In STL maps, is it better to use map::insert than []? Stack Overflow
    小工具:sshcopyid_老王的技术手册 ( 我的新博客:http://huoding.com )_百度空间
    djangoqbe
    C++ STL map的使用
    容器find_if函数定义和其第三个参数重载的疑问
    ArchLinux的安装与配置
    使用Grub进行Linux的硬盘安装与修复
    MySQL数据类型简介
    ArchLinux下Alsa的简单配置
  • 原文地址:https://www.cnblogs.com/qunxiadexiaoxiangjiao/p/8269419.html
Copyright © 2020-2023  润新知