zoukankan      html  css  js  c++  java
  • python学习之 字符串前'r'的用法

    6.4.3 原始字符串操作符( r/R )

    关于原始字符串的目的,在 Python1.5 里面已经有说明,是为了对付那些在字符串中出现
    的特殊字符(下面的小节会介绍这些特殊字符)。在原始字符串里,所有的字符都是直接按照字
    面的意思来使用,没有转义特殊或不能打印的字符。

    原始字符串的这个特性让一些工作变得非常的方便,比如正则表达式的创建(详见文档的 re
    模块).正则表达式是一些定义了高级搜索匹配方式的字符串,通常是由代表字符,分组、匹配信
    息、变量名、和字符类等的特殊符号组成。正则表达式模块已经包含了足够用的符号。但当你
    必须插入额外的符号来使特殊字符表现的像普通字符的时候,你就陷入了“字符数字”的泥潭!
    这时原始字符串就会派上用场了.
    除了原始字符串符号(引号前面的字母"r")以外,原始字符串跟普通字符串有着几乎完全相
    同的语法.
    这个'r'可以是小写也可以是大写,唯一的要求是必须紧靠在第一个引号前.
    在三个例子的第一个例子里面,我们需要一个反斜杠加一个'n'来而不是一个换行符.:

    >>> '\n'
    '\n'
    >>> print '\n'

    >>> r'\n'
    '\\n'
    >>> print r'\n'
    \n

    接下来的例子里,我们打不开我们的 README 文件了,为什么?因为'\t'和'\r'被当成
    不在我们的文件名中的特殊符号,但它们实际上文件路径的中 4 个独立的字符.

    >>> f = open('C:\windows\temp\readme.txt', 'r')
    Traceback (most recent call last):
    Edit   By Vheavens 
    Edit   By Vheavens                               
    File "<stdin>", line 1, in ?
    f = open('C:\windows\temp\readme.txt', 'r')
    IOError: [Errno 2] No such file or directory: 'C:\\win- dows\\temp\readme.txt'
    >>> f = open(r'C:\windows\temp\readme.txt', 'r')
    >>> f.readline()
    'Table of Contents (please check timestamps for last update!)\n'
    >>> f.close()

    最后我们要找一对原始的\n 字符而不是换行。为了找到它,我们使用了一个简单的正则表
    达式,它的作用是查找通常被用来表示空白字符的反斜线-字符对(backslash-character
    pairs)。

    >>> import re
    >>> m = re.search('\\[rtfvn]', r'Hello World!\n')
    >>> if m is not None: m.group()
    ...
    >>> m = re.search(r'\\[rtfvn]', r'Hello World!\n')
    >>> if m is not None: m.group()
    ...
    '\\n'



    'r'在正则表达式中的作用:

    核心笔记 : Python 原始字符串(raw strings)的用法
    你可能已经看到前面关于原始字符串用法的一些例子了。原始字符串的产生正是由于有正则表
    达式的存在。原因是 ASCII 字符和正则表达式特殊字符间所产生的冲突。比如,特殊符号“\b”在
    ASCII 字符中代表退格键,但同时“\b”也是一个正则表达式的特殊符号,代表“匹配一个单词边界”。
    为了让 RE 编译器把两个字符“\b”当成你想要表达的字符串,而不是一个退格键,你需要用另一个
    反斜线对它进行转义,即可以这样写:“\\b”。
    但这样做会把问题复杂化,特 别是当你的正则表达式字符串里有很多特殊字符时,就更容
    易令人困惑了。在第六章,我们曾介绍过原始字符串,它经常被用于简化正则表达式的复杂程度。
    事实上,很多 Python 程序员在定义正则表达式时都只使用原始字符串。
    下面的例子用来说明退格键“\b” 和正则表达式“\b”(包含或不包含原始字符串)之间的区别:
    >>> m = re.match('\bblow', 'blow') # backspace, no match #退格键,没有匹配
    >>> if m is not None: m.group()
    ...
    >>> m = re.match('\\bblow', 'blow') # escaped \, now it works #用\转义后,现在匹
    配了
    >>> if m is not None: m.group()
    ...
    'blow'
    >>> m = re.match(r'\bblow', 'blow') # use raw string instead #改用原始字符串

    '''

    说明:上一句第一个参数r'\bblow'中的'\b'这里表示的是单词边界,不过不明白它既然是表示原始字符串为什么不是就表示'\b'这两个字符 '\' 和 'b' 呢,

    这才是最原始的吗

    不过测试的结果确实是被当成单词边界了,那又怎样表示'\b'这两个字符呢,最原始的哦,

    就打比方说我要找'D:\Documents'文件夹下以字母b开头的文件,正则表达式应该怎么写呢?参考如下:

    >>>print '\blow', r'\blow', re.search(r'\\blow', r'\blow').group()

    输出结果为:low \blow \blow

    解释一下,re.search(r'\\blow', r'\blow').group()中第一个参数前两个字符'\\'转换为一个'\','b'即为字母'b',因此与原始字符'\blow'匹配

    '''
    >>> if m is not None: m.group()
    ...
    'blow'
    你可能注意到我们在正则表达式里使用“\d”,没用原始字符串,也没出现什么问题。那是因为
    ASCII 里没有对应的特殊字符,所以正则表达 式编译器能够知道你指的是一个十进制数字。

    ’r'在普通字符串中的使用:

    原始字符串的这个特性让一些工作变得非常的方便,比如正则表达式的创建(详见文档的re模块)。正则表达式是一些定义了高级搜索匹配方式的字符串,通常是由代表字符、分组、匹配信息、变量名和字符类等的特殊符号组成。正则表达式模块已经包含了足够用的符号。但当你必须插入额外的符号来使特殊字符表现的像普通字符的时候,你就陷入了“字符数字”的泥潭!这时原始字符串就会派上用场了。

    除了原始字符串符号(引号前面的字母“r”)以外,原始字符串跟普通字符串有着几乎完全相同的语法。这个'r'可以是小写也可以是大写,唯一的要求是必须紧靠在第一个引号前。在3个例子的第1个例子里面,我们需要一个反斜杠加一个“n”来而不是一个换行符。

    Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32
    Type "copyright", "credits" or "license()" for more information.
    >>> print 'abc\ndef'
    abc
    def
    >>> print r'abc\ndef'
    abc\ndef
    >>> if '\\n' == r'\n':
    print '=='


    ==
    >>>

     

  • 相关阅读:
    探究Spark算子-RDD
    Spark架构中YarnCluster模式作业流程
    Spark运行架构和组件
    Spark部署模式&端口号&提交作业参数说明
    Spark和Hadoop的联系和区别
    Idea中文件大小配置
    设计模式-之Scala单例模式
    HDFS集群格式化踩过的坑
    安装Spark时遇见的坑
    配置群起zookeeper的脚本所踩过的坑
  • 原文地址:https://www.cnblogs.com/s502/p/2975187.html
Copyright © 2011-2022 走看看