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 '=='


==
>>>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM