1. python怎樣使用解釋器
大學里計算機科學最吸引我的地方就是編譯器。最神奇的是,編譯器是如何讀出我寫的那些爛代碼,並且還能生成那麼復雜的程序。當我終於選了一門編譯方面的課程時,我發現這個過程比我想的要簡單得多。
在本系列的文章中,我會試著通過為一種基本命令語言IMP寫一個解釋器,來展示這種簡易性。因為IMP是一個簡單廣為人知的語言,所以打算用 Python寫這個解釋器。Python代碼看起來很像偽代碼,所以即使你不認識 Python,你也能理解它。解析可以通過一套從頭開始實現的解析器組合完成(在本系列的下一篇文章中會有解釋)。除了sys(用於I/O)、re(用於解析正則表達式)以及unittest(用於確保一切工作正常)庫,沒有使用其他額外的庫。
IMP 語言
在開始寫之前,我們先來討論一下將要解釋的語言。IMP是擁有下面結構的最小命令語言:
賦值語句(所有變數都是全局的,而且只能存儲整數):
Python
1
x := 1
條件語句:
Python
1
2
3
4
5
if x = 1 then
y := 2
else
y := 3
end
while循環:
Python
1
2
3
while x < 10 do
x := x + 1
end
復合語句(分號分隔):
Python
1
2
x := 1;
y := 2
OK,所以它只是一門工具語言,但你可以很容易就把它擴展成比Lua或python更有用的語言。我希望能把這份教程能保持盡量簡單。
下面這個例子是計算階乘的程序:
Python
1
2
3
4
5
6
n := 5;
p := 1;
while n > 0 do
p := p * n;
n := n - 1
end
IMP沒有讀取輸入的方式,所以初始狀態必須是在程序最開始寫一系列的賦值語句。也沒有列印結果的方式,所以解釋器必須在程序的結尾列印所有變數的值。
解釋器的結構
解釋器的核心是「中間表示」(Intermediate representation,IR)。這就是如何在內存中表示IMP程序。因為IMP是一個很簡單的語言,中間表示將直接對應於語言的語法;每一種表達和語句都有對應的類。在一種更復雜的語言中,你不僅需要一個「語法表示」,還需要一個更容易分析或運行的「語義表示」。
解釋器將會執行三個階段:
將源碼中的字元分割成標記符(token)
將標記符組織成一棵抽象語法樹(AST)。抽象語法樹就是中間表示。
評估這棵抽象語法樹,並在最後列印這棵樹的狀態
將字元串分割成標記符的過程叫做「詞法分析」,通過一個詞法分析器完成。關鍵字是很短,易於理解的字元串,包含程序中最基本的部分,如數字、標識符、關鍵字和操作符。詞法分析器會除去空格和注釋,因為它們都會被解釋器忽略。
實際執行這個解析過的抽象語法樹的過程稱為評估。這實際上是這個解析器中最簡單的部分了。
本文會把重點放在詞法分析器上。我們將編寫一個通用的詞彙庫,然後用它來為IMP創建一個詞法分析器。下一篇文章將會重點打造一個語法分析器和評估計算器。
詞彙庫
詞法分析器的操作相當簡單。它是基於正則表達式的,所以如果你不熟悉它們,你可能需要讀一些資料。簡單來說,正則表達式就是一種能描述其他字元串的特殊的格式化的字元串。你可以使用它們去匹配電話號碼或是郵箱地址,或者是像我們遇到在這種情況,不同類型的標記符。
詞法分析器的輸入可能只是一個字元串。簡單起見,我們將整個輸入文件都讀到內存中。輸出是一個標記符列表。每個標記符包括一個值(它代表的字元串)和一個標記(表示它是一個什麼類型的標記符)。語法分析器會使用這兩個數據來決定如何構建一棵抽象語法樹。
由於不論何種語言的詞法分析器,其操作都大同小異,我們將創建一個通用的詞法分析器,包括一個正則表達式列表和對應的標簽(tag)。對每一個表達式,它都會檢查是否和當前位置的輸入文本匹配。如果匹配,匹配文本就會作為一個標記符被提取出來,並且被加上該正則表達式的標簽。如果該正則表達式沒有標簽,那麼這段文本將會被丟棄。這樣免得我們被諸如注釋和空格之類的垃圾字元干擾。如果沒有匹配的正則表達式,程序就要報錯並終止。這個過程會不斷循環直到沒有字元可匹配。
下面是一段來自詞彙庫的代碼:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import sys
import re
def lex(characters, token_exprs):
pos = 0
tokens = []
while pos < len(characters):
match = None
for token_expr in token_exprs:
pattern, tag = token_expr
regex = re.compile(pattern)
match = regex.match(characters, pos)
if match:
text = match.group(0)
if tag:
token = (text, tag)
tokens.append(token)
break
if not match:
sys.stderr.write('Illegal character: %sn' % characters[pos])
sys.exit(1)
else:
pos = match.end(0)
return tokens
注意,我們遍歷正則表達式的順序很重要。lex會遍歷所有的表達式,然後接受第一個匹配成功的表達式。這也就意味著,當使用詞法分析器時,我們應當首先考慮最具體的表達式(像那些匹配運算元(matching operator)和關鍵詞),其次才是比較一般的表達式(像標識符和數字)。
詞法分析器
給定上面的lex函數,為IMP定義一個詞法分析器就非常簡單了。首先我們要做的就是為標記符定義一系列的標簽。IMP只需要三個標簽。RESERVED表示一個保留字或操作符。INT表示一個文字整數。ID代表標識符。
Python
1
2
3
4
5
import lexer
RESERVED = 'RESERVED'
INT= 'INT'
ID = 'ID'
接下來定義詞法分析器將會用到的標記符表達式。前兩個表達式匹配空格和注釋。它們沒有標簽,所以 lex 會丟棄它們匹配到的所有字元。
Python
1
2
3
token_exprs = [
(r'[ nt]+',None),
(r'#[^n]*', None),
然後,只剩下所有的操作符和保留字了。記住,每個正則表達式前面的「r」表示這個字元串是「raw」;Python不會處理任何轉義字元。這使我們可以在字元串中包含進反斜線,正則表達式正是利用這一點來轉義操作符比如「+」和「*」。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
(r':=', RESERVED),
(r'(',RESERVED),
(r')',RESERVED),
(r';', RESERVED),
(r'+',RESERVED),
(r'-', RESERVED),
(r'*',RESERVED),
(r'/', RESERVED),
(r'<=',RESERVED),
(r'<', RESERVED),
(r'>=',RESERVED),
(r'>', RESERVED),
(r'=', RESERVED),
(r'!=',RESERVED),
(r'and', RESERVED),
(r'or',RESERVED),
(r'not', RESERVED),
(r'if',RESERVED),
(r'then',RESERVED),
(r'else',RESERVED),
(r'while', RESERVED),
(r'do',RESERVED),
(r'end', RESERVED),
最後,輪到整數和標識符的表達式。要注意的是,標識符的正則表達式會匹配上面的所有的保留字,所以它一定要留到最後。
Python
1
2
3
(r'[0-9]+',INT),
(r'[A-Za-z][A-Za-z0-9_]*', ID),
]
既然正則表達式已經定義好了,我們還需要創建一個實際的lexer函數。
Python
1
2
def imp_lex(characters):
return lexer.lex(characters, token_exprs)
如果你對這部分感興趣,這里有一些驅動代碼可以測試輸出:
Python
1
2
3
4
5
6
7
8
9
10
11
import sys
from imp_lexer import *
if __name__ == '__main__':
filename = sys.argv[1]
file = open(filename)
characters = file.read()
file.close()
tokens = imp_lex(characters)
for token in tokens:
print token
繼續……
在本系列的下一篇文章中,我會討論解析器組合,然後描述如何使用他們從lexer中生成的標記符列表建立抽象語法樹。
如果你對於實現IMP解釋器很感興趣,你可以從這里下載全部的源碼。
在源碼包含的示例文件中運行解釋器:
Python
1
python imp.py hello.imp
運行單元測試:
Python
1
python test.py
2. python的正則表達式
1,正則表達式的一些內容
正則表達式主要是用來匹配文本中需要查找的內容,例如在一片文章中找出電話號碼,就中國的來說11位純數字(不說座機),則使用"d{11}" 意味匹配數字11次,就能准確的查找出文本中的電話號碼. 還有就是在編寫網路爬蟲的時候需要提取很多超鏈接再次進行爬取,使用正則表達式就很方便.直接匹配http開頭就行,當然也可以使用beautifulsoup的select方法.
看下面的程序看看正則表達提取文本中的郵箱:
w 匹配字母,數字,下劃線
+ 匹配1次或者多次
re是正則表達式的工具包,工具包出錯的話在anaconda的命令行輸入"pip install re"安裝,其他的工具包也是如此.
re.compile()中的r示意不是轉義字元,也就是保持後面字元串原樣,findall返回一個列表.下面還有一個版本的程序略有不同.
compile的另一個參數re.IGONORECASE(忽略大小寫),還可以是re.DORALL,多行模式,具體功能也是模糊不清,不過在使用通配符 . 匹配的時候加上re.DOTALL參數能夠匹配換行.如果希望忽略大小寫和多行模式都開啟可以使用re.compile(r'....',re.IGNORECASE|re.DOTALL) .
表達式使用( ),對匹配到的內容分為3組 也就是(w+)出現字母,數字,下劃線一次或多次,這個分組就是下面使用match對象的grou()方法的時候的參數.不給參數和參數0都是得到整個匹配到的內容, 參數1得到第一個括弧匹配到的內容,以此類推參數2和3,如果沒有括弧分組的話使用參數會出現錯誤.
search( )查找和正則式匹配的內容,只匹一次後面的那個找不到.返回一個match對象
w 匹配字母,數字,下劃線
W 匹配字母,數字.下劃線之外的所有字元
d 匹配數字
D 匹配非數字
s 匹配空格,製表符,換行符
S匹配除空格製表符,換行符之外的其他字元
[ .... ]定義自己的匹配,如[aeiouAEIOU ]匹配所有的母音字母,注意不是匹配單詞.
{最少次數,最多次數},例如{3,9} 匹配3-9次,{ ,10}匹配0-10次. 默認為匹配最多次數(貪心匹配),非貪心模式在後面加上問號
? 可選 0次或者1次吧
+匹配1次或多次
*匹配0次或者多次
^ 判斷開頭 ^d 如果待匹配串是數字開頭則返回第一個數字
$判斷結尾 d$ 如果待匹配串是數字結尾則返回最後一個數字
. 通配符,匹配除換行之外的所有字元
d{11} 匹配數字11次
. * 匹配所有字元除 換行
[a-zA-Z0-9._%+-] 小寫和大寫字母、數字、句點、下劃線、百分號、加號或短橫
[a-zA-Z]{2,4} 匹配字母 2 - 4次
3. python電話號碼正則問題。
手機號的,之前要檢查13開頭,後面要檢查15 也有14 所以乾脆就簡單點1後面10個數字,寫法如下
1\d{10}
至於固定電話的話,找到規律也這么寫就行了以你的這個固定電話為例
86\ 0755\ \d{8}
再擴展一點,區號可能是3位的,電話號碼可能是7位的那麼可以這樣寫
86\ \d{3,4}\ \d{7,8}
4. python如何處理單行實現三元表達式求解
首先讓我們構成一個正則表達式。為簡單起見,先構成一個正則表達式來識別下面格式的電話號碼數字:(nnn)nnn-nnnn。
第一步,創建一個pattern對象來匹配上面的子字元串。一旦程序運行後,如果需要的話,可以讓這個對象一般化。匹配上面格式的正則表達可以這樣構成:(\d{3})\s\d{3}-\d{4},其中\d單字元類型用來匹配從0到9的任何數字,另外{3}重復符號,是個簡便的記號,用來表示有3個連續的數字位,也等效於(\d\d\d)。\s也另外一個比較有用的單字元類型,用來匹配空格,比如Space鍵,tab鍵和換行符。
是不是很簡單?但是,如果把這個正則表達式的模式用在java程序中,還要做兩件事。對java的解釋器來說,在反斜線字元(\)前的字元有特殊的含義。在java中,與regex有關的包,並不都能理解和識別反斜線字元(\),盡管可以試試看。但為避免這一點,即為了讓反斜線字元(\)在模式對象中被完全地傳遞,應該用雙反斜線字元(\)。此外圓括弧在正則表達中兩層含義,如果想讓它解釋為字面上意思(即圓括弧),也需要在它前面用雙反斜線字元(\)。也就是像下面的一樣:
\\(\\d{3}\\)\\s\\d{3}-\\d{4}
import java.util.regex.*;
下面的一段代碼實現的功能是,從一個文本文件逐行讀入,並逐行搜索電話號碼數字,一旦找到所匹配的,然後輸出在控制台。
BufferedReader in;
Pattern pattern = Pattern.compile("\\(\\d{3}\\)\\s\\d{3}-\\d{4}");
in = new BufferedReader(new FileReader("phone"));String s;while ((s = in.readLine()) != null){Matcher matcher = pattern.matcher(s);
if (matcher.find()){System.out.println(matcher.group());}}in.close();
對那些熟悉用Python或Javascript來實現正則表達式的人來說,這段代碼很平常。在Python和Javascript這些語言中,或者其他的語言,這些正則表達式一旦明確地編譯過後,你想用到哪裡都可以。與Perl的單步匹配相比,看起來多多做了些工作,但這並不很費事。
find()方法,就像你所想像的,用來搜索與正則表達式相匹配的任何目標字元串,group()方法,用來返回包含了所匹配文本的字元串。應注意的是,上面的代碼,僅用在每行只能含有一個匹配的電話號碼數字字元串時。可以肯定的說,java的正則表達式包能用在一行含有多個匹配目標時的搜索。本文的原意在於舉一些簡單的例子來激起讀者進一步去學習java自帶的正則表達式包,所以對此就沒有進行深入的探討。
這相當漂亮吧! 但是很遺憾的是,這僅是個電話號碼匹配器。很明顯,還有兩點可以改進。如果在電話號碼的開頭,即區位號和本地號碼之間可能會有空格。我們也可匹配這些情況,則通過在正則表達式中加入\s?來實現,其中?元字元表示在模式可能有0或1個空格符。
第二點是,在本地號碼位的前三位和後四位數字間有可能是空格符,而不是連字型大小,更有勝者,或根本就沒有分隔符,就是7位數字連在一起。對這幾種情況,我們可以用(-|)?來解決。這個結構的正則表達式就是轉換器,它能匹配上面所說的幾種情況。在()能含有管道符|時,它能匹配是否含有空格符或連字元,而尾部的?元字元表示是否根本沒有分隔符的情況。
最後,區位號也可能沒有包含在圓括弧內,對此可以簡單地在圓括弧後附上?元字元,但這不是一個很好的解決方法。因為它也包含了不配對的圓括弧,比如"(555" 或 "555)"。相反,我們可以通過另一種轉換器來強迫讓電話號碼是否帶有有圓括弧:(\(\d{3}\)|\d{3})。如果我們把上面代碼中的正則表達式用這些改進後的來替換的話,上面的代碼就成了一個非常有用的電話號碼數字匹配器:
Pattern pattern =
Pattern.compile("(\\(\\d{3}\\)|\\d{3})\\s?\\d{3}(-|)?\\d{4}");
可以確定的是,你可以自己試著進一步改進上面的代碼。
現在看看第二個例子,它是從Friedl的中改編過來的。其功能是用來檢查文本文件中是否有重復的單詞,這在印刷排版中會經常遇到,同樣也是個語法檢查器的問題。
匹配單詞,像其他的一樣,也可以通過好幾種的正則表達式來完成。可能最直接的是\b\w+\b,其優點在於只需用少量的regex元字元。其中\w元字元用來匹配從字母a到u的任何字元。+元字元表示匹配匹配一次或多次字元,\b元字元是用來說明匹配單詞的邊界,它可以是空格或任何一種不同的標點符號(包括逗號,句號等)。
現在,我們怎樣來檢查一個給定的單詞是否被重復了三次?為完成這個任務,需充分利用正則表達式中的所熟知的向後掃描。如前面提到的,圓括弧在正則表達式中有幾種不同的用法,一個就是能提供組合類型,組合類型用來保存所匹配的結果或部分匹配的結果(以便後面能用到),即使遇到有相同的模式。在同樣的正則表達中,可能(也通常期望)不止有一個組合類型。在第n個組合類型中匹配結果可以通過向後掃描來獲取到。向後掃描使得搜索重復的單詞非常簡單:\b(\w+)\s+\1\b。
圓括弧形成了一個組合類型,在這個正則表示中它是第一組合類型(也是僅有的一個)。向後掃描\1,指的是任何被\w+所匹配的單詞。我們的正則表達式因此能匹配這樣的單詞,它有一個或多個空格符,後面還跟有一個與此相同的單詞。注意的是,尾部的定位類型(\b)必不可少,它可以防止發生錯誤。如果我們想匹配"Paris in the the spring",而不是匹配"Java's regex package is the theme of this article"。根據java現在的格式,則上面的正則表達式就是:Pattern pattern =Pattern.compile("\\b(\\w+)\\s+\\1\\b");
最後進一步的修改是讓我們的匹配器對大小寫敏感。比如,下面的情況:"The the theme of this article is the Java's regex package.",這一點在regex中能非常簡單地實現,即通過使用在Pattern類中預定義的靜態標志CASE_INSENSITIVE :
Pattern pattern =Pattern.compile("\\b(\\w+)\\s+\\1\\b",
Pattern.CASE_INSENSITIVE);
有關正則表達式的話題是非常豐富,而且復雜的,用Java來實現也非常廣泛,則需要對regex包進行的徹底研究,我們在這里所講的只是冰山一角。即使你對正則表達式比較陌生,使用regex包後會很快發現它強大功能和可伸縮性。
5. Python其實很簡單 第十一章 正則表達式
正則表達式是一個特殊的字元序列,它用來檢查一個字元串是否與某種模式匹配。正則表達式在編譯程序中至關重要,但並不是每個人都需要特別深入的學習和掌握。在此,只介紹一些最基本的應用。
1、元字元
元字元是構成正則表達式的一些特殊字元。在正則表達式中,元字元被賦予了新的含義。
下面介紹一些常用的元字元及其含義:
. 匹配除換行符以外的任意字元。
w 匹配字母、數字、下劃線或漢字。
W 匹配w所匹配的字元以外的字元。
s 匹配單個空白符(包括Tab鍵和換行符)。
S 匹配除s匹配的字元以外的字元。
d 匹配數字。
b 匹配單詞的分界符,如:空格、標點符號或換行符。
^ 匹配字元串的開始
$ 匹配字元串的結束
2、限定符
限定符是在正則表達式中用來指定數量的字元。常用的限定符有:
? 匹配前面的字元0或1次。如:zo?m可以匹配zom和zm,但不能匹配 zoom
+ 匹配前面的字元1或n次。如:zo?m可以匹配zom和zoom,但不能匹配zm
* 匹配前面的字元0或n次。如:zo?m可以匹配zom、zoom和zm
{n} 匹配前面的字元n次。如:zo{2}m可以匹配zoom,但不能匹配zom和zm
{n,} 匹配前面的字元至少n次。如:zo{1,}m可以匹配zom和zoom,但不能匹配zm
{n,m} 匹配前面的字元至少n次,最多m次。如:zo{1,2}m可以匹配zom和zoom,但不能匹配zm
3、方括弧」[ ]」的用途
方括弧「[ ]」里可以列出某個字元范圍。如:[aeiou]表示匹配任意一個母音字母,[zqsl]表示匹配姓氏「趙錢孫李」的拼音第一個字母。
4、排除字元
方括弧」[ ]」中的「^」字元表示排除的意思,如:[^aeiou]表示匹配任意一個非母音字母的字元。
5、選擇字元
字元「|」相當於「或」。如:(^d{3}[-]d{8})|(^d{4}[-]d{7})$可以匹配形如」 - 」或「 - 」的電話號碼格式。
6、轉義字元
對於已經用於定義元字元和限定符的字元,需要加轉義符「」來表示。
如:為了匹配形如「192.168.0.1」的IPv4地址(1~255.0~255.0~255.0~255),可以用這樣的正則表達式:^(25[0-5]|2[0-4][0-9]|[0,1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]).(25[0-5]|2[0-4][0-9]|[0,1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0).(25[0-5]|2[0-4][0-9]|[0,1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0).(25[0-5]|2[0-4][0-9]|[0,1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$
這里解釋一下第一段IP地址的規則,取值范圍為1~255,可分解為以下情況:
250~255:25[0-5];
200~249:2[0-4][0-9];
100~199:[01]{1}[0-9]{2};
0~99: [0-9]{1}[1-9]
再加上」.」: .
其他三段地址和第一段相似。
7、「( )」可以用於分組
在正則表達式中,用「( )」括起來的部分是一個整體。
8、r(或R)的意義
在正則表達式中,為了保證模式字元串為原生字元串(沒有經過加工處理的字元串),可以在模式字元串前加上一個字元『r』或『R』。例如:
# 這里用到對的re.match()方法接下來介紹
>>> import re # 導入re模塊
>>> re.match('bPy[a-z]+','Python') # 表達式'bPy[a-z]+'不能匹配』Python』
>>> re.match('bPy[a-z]+','Python') # 表達式'bPy[a-z]+'可以匹配』Python』
在上述代碼中,原本要用作匹配單詞開始或結束的元字元』b』在表達式中字元串中會被視為轉義一個字元『b』,為了轉義』b』就不得不再加一個』』符號。
也可以採用下面的方法:
>>> re.match(r'bPy[a-z]+','Python') #加字元』r』,可以保證原生字元串
9、match()方法
Match()方法 嘗試從字元串的起始位置匹配一個模式,如果不是起始位置匹配成功的話,match() 就返回 none。
語法格式:
re.match(pattern, string, [flags])
其中,pattern表示匹配的正則表達式;string是要匹配的字元串;flags表示標志位,用於控制正則表達式的匹配方式,如:re.I表示不區分大小寫。
例:
import re #導入re模塊
print(re.match('www', 'www.python.org/').span()) #span()函數可以獲取匹配的位置
print(re.match('org', 'www.python.org'))
輸出結果為:
(0, 3) #在位置0到3(不包括3)匹配成功
None #從起始位置未能匹配成功
10、search()方法
search()方法用於在整個字元串中搜索第一個匹配的值,如果匹配成功,則返回Match對象,否則返回None。
語法格式:
re.search(pattern, string, [flags])
其中,pattern表示匹配的正則表達式;string是要匹配的字元串;flags表示標志位,用於控制正則表達式的匹配方式,如:re.I表示不區分大小寫。
例如:
>>> re.search(r'Pyw+','It's easy to use Python, but it's not easy to learn Python.')
可以看出,目標字元串「It's easy to use Python, but it's not easy to learn Python.」中一共有兩個『Python』,search()方法可以從字元串的起始位置開始查找到『Python』,當找到第一個匹配值後就停止查找,返回位置信息。
match()和search()的比較
match()要求目標字元串的起始位置就能匹配,search()對目標字元串全段進行逐次匹配,只要首次匹配成功就停止匹配。
請看下例:
>>> import re
>>> print(re.match(r'Pyw+','It's easy to use Python, but it's not easy to learn Python.'))
輸出結果:None
11、findall()方法
findall()方法用於在整個字元串中搜索所有匹配的值,如果匹配成功,則返回以匹配值為元素的列表,否則返回空列表。
語法格式:
re.findall(pattern, string[, flags])
其中,pattern表示匹配的正則表達式;string是要匹配的字元串;flags表示標志位,用於控制正則表達式的匹配方式,如:re.I表示不區分大小寫。
例:
>>> import re
>>>print(re.findall(r'Pyw+','It's easy to use Python, but it's not easy to learn Python.'))
輸出結果:['Python', 'Python']
可以看出,findall()的結果沒有指出匹配的具體位置。
12、正則表達式的應用
字元串替換
這里要用到sub()方法。它的語法格式如下:
re.sub(pattern, repl, string [,count] [,flgs])
其中,pattern是模式字元串;repl是用於替換的字元串;string是原字元串;可選參數count為模式匹配後替換的最大次數,省缺表示替換所有的匹配;可選參數flags的意義與前面的方法的該參數一致。
例:
>>> import re
>>> str1='x=36.567 y=123.234'
>>> str2=re.sub('.d+','',str1) #用空格代替小數點及其後的數字
>>> print(str2)
輸出結果:x=36 y=123
分隔字元串
這里要用到split()方法。它的返回值為一個列表,它的語法格式如下:
re.split(pattern, string [,maxsplit] [,flgs])
其中,pattern是模式字元串;string是原字元串;可選參數maxsplit為最大拆分次數,省缺表示拆分所有的匹配;可選參數flags的意義與前面的方法的該參數一致。
例:
>>> import re
>>> str='白日依山盡,黃河入海流。欲窮千里目,更上一層樓!'
>>> re.split(r',|。|!',str) #按照「,」、「。」、「!」分隔字元串。
['白日依山盡', '黃河入海流', '欲窮千里目', '更上一層樓', '']
注意,返回值列表中多出了一個空字元。