標籤:python str re Regex
http://blog.csdn.net/pipisorry/article/details/45476817
Python除了 str 對象內建的一些方法外,re文文書處理能力也很強大。
Python中逸出字元
Regex使用反斜線" \ "來代表特殊形式或用作逸出字元,這裡跟Python的文法衝突,因此,Python用" \\\\ "表示Regex中的" \ ",因為Regex中如果要匹配" \ ",需要用\來轉義,變成" \\ ",而Python文法中又需要對字串中每一個\進行轉義,所以就變成了" \\\\ "。
上面的寫法是不是覺得很麻煩,為了使Regex具有更好的可讀性,Python特別設計了原始字串(raw string),需要提醒你的是,在寫檔案路徑的時候就不要使用raw string了,這裡存在陷阱。raw string就是用’r’作為字串的首碼,如 r”\n”:表示兩個字元”\”和”n”,而不是分行符號了。Python中寫Regex時推薦使用這種形式。
Regex元字元說明
. 匹配除分行符號以外的任一字元
^ 匹配字串的開始
$ 匹配字串的結束
[] 用來匹配一個指定的字元類別
? 對於前一個字元字元重複0次到1次
*對於前一個字元重複0次到無窮次
{} 對於前一個字元重複m次
{m,n} 對前一個字元重複為m到n次
\d 匹配數字,相當於[0-9]
\D 匹配任何非數字字元,相當於[^0-9]
\s 匹配任意的空白符,相當於[ fv]
\S 匹配任何非空白字元,相當於[^ fv]
\w 匹配任何字母數字字元,相當於[a-zA-Z0-9_]
\W 匹配任何非字母數字字元,相當於[^a-zA-Z0-9_]
\b 匹配單詞的開始或結束
萬用字元和Regex linux\python\django\notepad++
基本規則
‘[‘ ‘]’ 字元集合設定符
首先說明一下字元集合設定的方法。由一對方括弧括起來的字元,表明一個字元集合,能夠匹配包含在其中的任意一個字元。比如 [abc123],表明字元’a’ ‘b’ ‘c’ ‘1’ ‘2’ ‘3’都符合它的要求。可以被匹配。
在’[‘ ‘]’中還可以通過 ’-‘ 減號來指定一個字元集合的範圍,比如可以用[a-zA-Z]來指定所以英文字母的大小寫,因為英文字母是按照從小到大的順序來排的。你不可以把大小的順序顛倒了,比如寫成[z-a]就不對了。
如果在’[‘ ‘]’裡面的開頭寫一個 ‘^’ 號,則表示取非,即在括弧裡的字元都不匹配。如[^a-zA-Z]表明不匹配所有英文字母。但是如果 ‘^’不在開頭,則它就不再是表示取非,而表示其本身,如[a-z^A-Z]表明匹配所有的英文字母和字元’^’。
‘|’ 或規則
將兩個規則並列起來,以‘|’串連,表示只要滿足其中之一就可以匹配。比如
[a-zA-Z]|[0-9] 表示滿足數字或字母就可以匹配,這個規則等價於 [a-zA-Z0-9]
注意:關於’|’要注意兩點:
第一, 它在’[‘ ‘]’之中不再表示或,而表示他本身的字元。如果要在’[‘ ‘]’外面表示一個’|’字元,必須用反斜線引導,即 ’/|’ ;
第二, 它的有效範圍是它兩邊的整條規則,比如‘dog|cat’匹配的是‘dog’和’cat’,而不是’g’和’c’。如果想限定它的有效範圍,必需使用一個無擷取的群組 ‘(?: )’包起來。比如要匹配 ‘I have a dog’或’I have a cat’,需要寫成r’I have a (?:dog|cat)’ ,而不能寫成 r’I have a dog|cat’
例
s = ‘I have a dog , I have a cat’
re.findall( r’I have a (?:dog|cat)’ , s )
[‘I have a dog’, ‘I have a cat’] #正如我們所要的
下面再看看不用無擷取的群組會是什麼後果:
re.findall( r’I have a dog|cat’ , s )
[‘I have a dog’, ‘cat’] #它將’I have a dog’ 和’cat’當成兩個規則了
至於無擷取的群組的使用,後面將仔細說明。這裡先跳過。
‘.’ 匹配所有字元
匹配除分行符號’\n’外的所有字元。如果使用了’S’選項,匹配包括’\n’的所有字元。
例:
s=’123 \n456 \n789’
findall(r‘.+’,s)
[‘123’, ‘456’, ‘789’]
re.findall(r‘.+’ , s , re.S)
[‘123\n456\n789’]
‘^’和’$’ 匹配字串開頭和結尾
注意’^’不能在‘[ ]’中,否則含意就發生變化,具體請看上面的’[‘ ‘]’說明。 在多行模式下,它們可以匹配每一行的行首和行尾。具體請看後面compile函數說明的’M’選項部分
‘\d’ 匹配數字
這是一個以’\’開頭的逸出字元,’\d’表示匹配一個數字,即等價於[0-9]
‘\D’ 匹配非數字
這個是上面的反集,即匹配一個非數位字元,等價於[^0-9]。注意它們的大小寫。下面我們還將看到Python的正則規則中很多逸出字元的大小寫形式,代表互補的關係。這樣很好記。
‘\w’ 匹配字母和數字
匹配所有的英文字母和數字,即等價於[a-zA-Z0-9]。
‘\W’ 匹配非英文字母和數字
即’\w’的補集,等價於[^a-zA-Z0-9]。
‘\s’ 匹配間隔符
即匹配空格符、定位字元、斷行符號符等表示分隔意義的字元,它等價於[ \t\r\n\f\v]。(注意最前面有個空格)
‘\S’ 匹配非間隔符
即間隔符的補集,等價於[^ \t\r\n\f\v]
‘\A’ 匹配字串開頭
匹配字串的開頭。它和’^’的區別是,’\A’只匹配整個字串的開頭,即使在’M’模式下,它也不會匹配其它行的行首。
‘\Z’ 匹配字串結尾
匹配字串的結尾。它和’$’的區別是,’\Z’只匹配整個字串的結尾,即使在’M’模式下,它也不會匹配其它各行的行尾。
例:
s= ‘12 34\n56 78\n90’
re.findall( r’^\d+’ , s , re.M ) #匹配位於行首的數字
[‘12’, ‘56’, ‘90’]
re.findall( r’\A\d+’, s , re.M ) #匹配位於字串開頭的數字
[‘12’]
re.findall( r’\d+$’ , s , re.M ) #匹配位於行尾的數字
[‘34’, ‘78’, ‘90’]
re.findall( r’\d+\Z’ , s , re.M ) #匹配位於字串尾的數字
[‘90’]
‘\b’ 匹配單詞邊界
它匹配一個單詞的邊界,比如空格等,不過它是一個‘0’長度字元,它匹配完的字串不會包括那個分界的字元。而如果用’\s’來匹配的話,則匹配出的字串中會包含那個分界符。
例:
s = ‘abc abcde bc bcd’
re.findall( r’\bbc\b’ , s ) #匹配一個單獨的單詞 ‘bc’ ,而當它是其它單詞的一部分的時候不匹配
[‘bc’] #只找到了那個單獨的’bc’
re.findall( r’\sbc\s’ , s ) #匹配一個單獨的單詞 ‘bc’
[’ bc ‘] #只找到那個單獨的’bc’,不過注意前後有兩個空格,可能有點看不清楚
‘\B’ 匹配非邊界
和’\b’相反,它只匹配非邊界的字元。它同樣是個0長度字元。
接上例:
re.findall( r’\Bbc\w+’ , s ) #匹配包含’bc’但不以’bc’為開頭的單詞
[‘bcde’] #成功匹配了’abcde’中的’bcde’,而沒有匹配’bcd’
‘(?:)’ 無擷取的群組
當你要將一部分規則作為一個整體對它進行某些操作,比如指定其重複次數時,你需要將這部分規則用’(?:’ ‘)’把它包圍起來,而不能僅僅只用一對括弧,那樣將得到絕對出人意料的結果。
例:匹配字串中重複的’ab’
s=’ababab abbabb aabaab’
re.findall( r’\b(?:ab)+\b’ , s )
[‘ababab’]
如果僅使用一對括弧,看看會是什麼結果:
re.findall( r’b(ab)+\b’ , s )
[‘ab’]
這是因為如果只使用一對括弧,那麼這就成為了一個組(group)。
‘(?# )’ 注釋
Python允許你在Regex中寫入注釋,在’(?#’ ‘)’之間的內容將被忽略。
(?iLmsux) 編譯選項指定
Python的正則式可以指定一些選項,這個選項可以寫在findall或compile的參數中,也可以寫在正則式裡,成為正則式的一部分。這在某些情況下會便利一些。具體的選項含義請看後面的compile函數的說明。
此處編譯選項’i’ 等價於IGNORECASE ,L 等價於 LOCAL ,m 等價於 MULTILINE ,s 等價於 DOTALL ,u 等價於 UNICODE , x 等價於 VERBOSE 。
請注意它們的大小寫。在使用時可以只指定一部分,比如只指定忽略大小寫,可寫為 ‘(?i)’,要同時忽略大小寫並使用多行模式,可以寫為 ‘(?im)’。
另外要注意選項的有效範圍是整條規則,即寫在規則的任何地方,選項都會對全部整條正則式有效。
前向界定與後向界定
有時候需要匹配一個跟在特定內容後面的或者在特定內容前面的字串,Python提供一個簡便的前向界定和後向界定功能,或者叫前置指定和跟從指定功能。它們是:
‘(?<=…)’ 前向界定
括弧中’…’代表你希望匹配的字串的前面應該出現的字串。
‘(?=…)’ 後向界定
括弧中的’…’代表你希望匹配的字串後面應該出現的字串。
例: 你希望找出c語言的注釋中的內容,它們是包含在’/’和’/’之間,不過你並不希望匹配的結果把’/’和’/’也包括進來,那麼你可以這樣用:
s=r’/* comment 1 / code / comment 2 */’
re.findall( r’(?<=/*).+?(?=*/)’ , s )
[’ comment 1 ‘, ’ comment 2 ‘]
注意這裡我們仍然使用了最小匹配,以避免把整個字串給匹配進去了。
要注意的是,前向界定括弧中的運算式必須是常值,也即你不可以在前向界定的括弧裡寫正則式。比如你如果在下面的字串中想找到被字母夾在中間的數字,你不可以用前向界定:
例:
s = ‘aaa111aaa , bbb222 , 333ccc ‘
re.findall( r’(?<=[a-z]+)\d+(?=[a-z]+)’ , s ) # 錯誤的用法
它會給出一個錯誤資訊:
error: look-behind requires fixed-width pattern
不過如果你只要找出後面接著有字母的數字,你可以在後向界定寫正則式:
re.findall( r’\d+(?=[a-z]+)’, s )
[‘111’, ‘333’]
如果你一定要匹配包夾在字母中間的數字,你可以使用組(group)的方式
re.findall (r’[a-z]+(\d+)[a-z]+’ , s )
[‘111’]
組的使用將在後面詳細講解。
前向非界定和後向非界定
‘(?< !…)’前向非界定(<和!中間是沒有空格的,makedown編輯器會將< !當成注釋,不顯示==!給醉了。。。)
只有當你希望的字串前面不是’…’的內容時才匹配
‘(?!…)’後向非界定
只有當你希望的字串後面不跟著’…’內容時才匹配。
接上例,希望匹配後面不跟著字母的數字
re.findall( r’\d+(?!\w+)’ , s )
[‘222’]
注意這裡我們使用了\w而不是像上面那樣用[a-z],因為如果這樣寫的話,結果會是:
re.findall( r’\d+(?![a-z]+)’ , s )
[‘11’, ‘222’, ‘33’]
這和我們期望的似乎有點不一樣。它的原因,是因為’111’和’222’中的前兩個數字也是滿足這個要求的。因此可看出,正則式的使用還是要相當小心的,因為我開始就是這樣寫的,看到結果後才明白過來。不過Python實驗起來很方便,這也是指令碼語言的一大優點,可以一步一步的實驗,快速得到結果,而不用經過煩瑣的編譯、連結過程。也因此學習Python就要多試,跌跌撞撞的走過來,雖然曲折,卻也很有樂趣。
組的基本知識
上面我們已經看過了Python的正則式的很多基本用法。不過如果僅僅是上面那些規則的話,還是有很多情況下會非常麻煩,比如上面在講前向界定和後向界定時,取夾在字母中間的數位例子。用前面講過的規則都很難達到目的,但是用了組以後就很簡單了。
‘(‘’)’ 無命名組
最基本的組是由一對圓括弧括起來的正則式。比如上面匹配包夾在字母中間的數位例子中使用的(\d+),我們再回顧一下這個例子:
s = ‘aaa111aaa , bbb222 , 333ccc ‘
re.findall (r’[a-z]+(\d+)[a-z]+’ , s )
[‘111’]
可以看到findall函數只返回了包含在’()’中的內容,而雖然前面和後面的內容都匹配成功了,卻並不包含在結果中。
除了最基本的形式外,我們還可以給組起個名字,它的形式是
‘(?P…)’ 命名組
‘(?P’代表這是一個Python的文法擴充’<…>’裡面是你給這個組起的名字,比如你可以給一個全部由數字組成的組叫做’num’,它的形式就是’(?P\d+)’。起了名字之後,我們就可以在後面的正則式中通過名字調用這個組,它的形式是
‘(?P=name)’ 調用已匹配的命名組
要注意,再次調用的這個組是已被匹配的組,也就是說它裡面的內容是和前面命名組裡的內容是一樣的。
我們可以看更多的例子:請注意下面這個字串各子串的特點。
s=’aaa111aaa,bbb222,333ccc,444ddd444,555eee666,fff777ggg’
我們看看下面的正則式會返回什麼樣的結果:
re.findall( r’([a-z]+)\d+([a-z]+)’ , s ) # 找出中間夾有數位字母
[(‘aaa’, ‘aaa’), (‘fff’, ‘ggg’)]
re.findall( r ‘(?P[a-z]+)\d+(?P=g1)’ , s ) #找出被中間夾有數位前後同樣的字母
[‘aaa’]
re.findall( r’[a-z]+(/d+)([a-z]+)’ , s ) #找出前面有字母引導,中間是數字,後面是字母的字串中的中間的數字和後面的字母
[(‘111’, ‘aaa’), (‘777’, ‘ggg’)]
我們可以通過命名組的名字在後面調用已匹配的命名組,不過名字也不是必需的。
‘\number’ 通過序號調用已匹配的組
正則式中的每個組都有一個序號,序號是按組從左至右,從1開始的數字,你可以通過下面的形式來調用已匹配的組
比如上面找出被中間夾有數位前後同樣的字母的例子,也可以寫成:
re.findall( r’([a-z]+)\d+\1’ , s )
[‘aaa’]
結果是一樣的。
我們再看一個例子
s=’111aaa222aaa111 , 333bbb444bb33’
re.findall( r’(\d+)([a-z]+)(\d+)(\2)(\1)’ , s ) #找出完全對稱的 數字-字母-數字-字母-數字 中的數字和字母
[(‘111’, ‘aaa’, ‘222’, ‘aaa’, ‘111’)]
條件匹配功能(Python2.4以後的re模組)
‘(?(id/name)yes-pattern|no-pattern)’ 判斷指定組是否已匹配,執行相應的規則
這個規則的含義是,如果id/name指定的組在前面匹配成功了,則執行yes-pattern的正則式,否則執行no-pattern的正則式。
舉個例子,比如要匹配一些形如 [email protected] 的郵箱地址,不過有的寫成< [email protected] >即用一對<>括起來,有點則沒有,要匹配這兩種情況,可以這樣寫
s=’
匯入Regex模組
3.1、匯入Regex模組
import re
3.2、查看Regex模組方法
dir(re)
[‘DEBUG’, ‘DOTALL’, ‘I’, ‘IGNORECASE’, ‘L’, ‘LOCALE’, ‘M’, ‘MULTILINE’, ‘S’, ‘Scanner’, ‘T’,’TEMPLATE’, ‘U’, ‘UNICODE’, ‘VERBOSE’, ‘X’, ‘_MAXCACHE’, ‘all‘, ‘builtins‘, ‘doc‘,’file‘, ‘name‘, ‘package‘, ‘version‘, ‘_alphanum’, ‘_cache’, ‘_cache_repl’,’_compile’, ‘_compile_repl’, ‘_expand’, ‘_pattern_type’, ‘_pickle’, ‘_subx’, ‘compile’,’copy_reg’, ‘error’, ‘escape’, ‘findall’, ‘finditer’, ‘match’, ‘purge’, ‘search’, ‘split’,’sre_compile’, ‘sre_parse’, ‘sub’, ‘subn’, ‘sys’, ‘template’]
Match Object對象擁有的方法
1.group([group1,…])
返回匹配到的一個或者多個子組。如果是一個參數,那麼結果就是一個字串,如果是多個參數,那麼結果就是一個參數一個item的元組。group1的預設值為0(將返回所有的匹配值).如果groupN參數為0,相對應的傳回值就是全部匹配的字串,如果group1的值是[1…99]範圍之內的,那麼將匹配對應括弧組的字串。如果組號是負的或者比pattern中定義的組號大,那麼將拋出IndexError異常。如果pattern沒有匹配到,但是group匹配到了,那麼group的值也為None。如果一個pattern可以匹配多個,那麼組對應的是樣式匹配的最後一個。另外,子組是根據括弧從左向右來進行區分的。
>m=re.match(“(\w+) (\w+)”,”abcd efgh, chaj”)
>m.group() # 匹配全部
‘abcd efgh’
>m.group(1) # 第一個括弧的子組.
‘abcd’
>m.group(2)
‘efgh’
>m.group(1,2) # 多個參數返回一個元組
(‘abcd’, ‘efgh’)
>m=re.match(“(?P\w+) (?P\w+)”,”sam lee”)
m.group(“first_name”) #使用group擷取含有name的子組
‘sam’
m.group(“last_name”)
‘lee’
下面把括弧去掉
>m=re.match(“\w+ \w+”,”abcd efgh, chaj”)
>m.group()
‘abcd efgh’
>m.group(1)
Traceback (most recent call last):
File “pyshell#32>”, line 1, in
m.group(1)
IndexError: no such group
If a group matches multiple times, only the last match is accessible:
如果一個組匹配多個,那麼僅僅返回匹配的最後一個的。
>m=re.match(r”(..)+”,”a1b2c3”)
>m.group(1)
‘c3’
>m.group()
‘a1b2c3’
Group的預設值為0,返回Regexpattern匹配到的字串
>s=”afkak1aafal12345adadsfa”
>pattern=r”(\d)\w+(\d{2})\w”
>m=re.match(pattern,s)
>print m
None
>m=re.search(pattern,s)
>m
<_sre.SRE_Match object at 0x00C2FDA0>
>m.group()
‘1aafal12345a’
>m.group(1)
‘1’
>m.group(2)
‘45’
>m.group(1,2,0)
(‘1’, ‘45’, ‘1aafal12345a’)
2.groups([default])
返回一個包含所有子組的元組。Default是用來設定沒有匹配到組的預設值的。Default預設是”None”,
>m=re.match(“(\d+).(\d+)”,”23.123”)
>m.groups()
(‘23’, ‘123’)
>m=re.match(“(\d+).?(\d+)?”,”24”) #這裡的第二個\d沒有匹配到,使用預設值”None”
>m.groups()
(‘24’, None)
>m.groups(“0”)
(‘24’, ‘0’)
3.groupdict([default])
返回匹配到的所有命名子組的字典。Key是name值,value是匹配到的值。參數default是沒有匹配到的子組的預設值。這裡與groups()方法的參數是一樣的。預設值為None
>m=re.match(“(\w+) (\w+)”,”hello world”)
>m.groupdict()
{}
>m=re.match(“(?P\w+) (?P\w+)”,”hello world”)
>m.groupdict()
{‘secode’: ‘world’, ‘first’: ‘hello’}
通過上例可以看出,groupdict()對沒有name的子組不起作用
python re模組用法總結
常用的Regex處理函數
1、re.search
re.search 函數會在字串內尋找模式比對,只到找到第一個匹配然後返回,如果字串沒有匹配,則返回None。
提示:當我們不會用模組方法的時候用help
help(re.search)
search(pattern, string, flags=0)
第一個參數:規則
第二個參數:表示要匹配的字串
第三個參數:標緻位,用於控制Regex的匹配方式
執行個體:下面的例子kuangl
name=”Hello,My name is kuangl,nice to meet you…”
k=re.search(r’k(uan)gl’,name)
ifk:
… printk.group(0),k.group(1)
… else:
… print”Sorry,not search!”
…
kuangl uan
2、re.match
re.match 嘗試從字串的開始匹配一個模式,也等於說是匹配第一個單詞
help(re.match)
match(pattern, string, flags=0)
第一個參數:規則
第二個參數:表示要匹配的字串
第三個參數:標緻位,用於控制Regex的匹配方式
執行個體:下面的例子匹配Hello單詞
name=”Hello,My name is kuangl,nice to meet you…”
k=re.match(r”(\H….)”,name)
if k:
… print k.group(0),’\n’,k.group(1)
… else:
… print “Sorry,not match!”
…
Hello
Hello
re.match與re.search的區別:re.match只匹配字串的開始,如果字串開始不符合Regex,則匹配失敗,函數返回None;而re.search匹配整個字串,直到找到一個匹配。
3、re.findall
re.findall 在目標字串尋找符合規則的字串
help(re.findall)
findall(pattern, string, flags=0)
第一個參數:規則
第二個參數:目標字串
但三個參數:後面還可以跟一個規則選擇項
返回的結果是一個列表,建中存放的是符合規則的字串,如果沒有符合規則的字串唄找到,就會返回一個空值。
執行個體:尋找郵件帳號
mail=’[email protected] [email protected] [email protected]’#第3個故意沒有角括弧
re.findall(r’(\[email protected]….[a-z]{3})’,mail)
[‘[email protected]’, ‘[email protected]’, ‘[email protected]’]
4、re.sub
re.sub 用於替換字串的匹配項
help(re.sub)
sub(pattern, repl, string, count=0)
第一個參數:規則
第二個參數:替換後的字串
第三個參數:字串
第四個參數:替換個數。預設為0,表示每個匹配項都替換
執行個體:將空白處替換成-
test=”Hi, nice to meet you where are you from?”
re.sub(r’\s’,’-‘,test)
‘Hi,-nice-to-meet-you-where-are-you-from?’
re.sub(r’\s’,’-‘,test,5) #替換至第5個
‘Hi,-nice-to-meet-you-where are you from?’
5、re.split
re.split 用於來分割字串
help(re.split)
split(pattern, string, maxsplit=0)
第一個參數:規則
第二個參數:字串
第三個參數:最大分割字串,預設為0,表示每個匹配項都分割
執行個體:分割所有的字串
test=”Hi, nice to meet you where are you from?”
re.split(r”\s+”,test)
[‘Hi,’, ‘nice’, ‘to’, ‘meet’, ‘you’, ‘where’, ‘are’, ‘you’, ‘from?’]
re.split(r”\s+”,test,3) #分割前三個
[‘Hi,’, ‘nice’, ‘to’, ‘meet you where are you from?’]
6、re.compile
re.compile 可以把Regex編譯成一個正則對象。可以把那些經常使用的Regex編譯成Regex對象,這樣可以提高一定的效率。
help(re.compile)
compile(pattern, flags=0)
第一個參數:規則
第二個參數:標誌位
執行個體:
test=”Hi, nice to meet you where are you from?”
k=re.compile(r’\w*o\w*’) #匹配帶o的字串
dir(k)
[‘copy‘, ‘deepcopy‘, ‘findall’, ‘finditer’, ‘match’, ‘scanner’, ‘search’, ‘split’,’sub’, ‘subn’]
print k.findall(test) #顯示所有包涵o的字串
[‘to’, ‘you’, ‘you’, ‘from’]
print k.sub(lambdam: ‘[‘+m.group(0) +’]’,test) # 將字串中含有o的單詞用[]括起來
Hi, nice [to] meet [you] where are [you] [from]?
pythonRegex的例子
日誌分析時,假設給定的字串:
char str = “10.10.1.1 [2015/04/22 +0800] /ab/cd/?test0=123&test2=234 xxxx”; 要從中擷取2015/04/22、/ab/cd/和234等值。
str = “10.10.1.1 [2015/04/22 +0800] /ab/cd/?test0=123&test2=234 xxxx”
print(re.findall(“\d{4}/\d{2}/\d{2}|/\w{2}/\w{2}|(?<=test2=)\d+”, str))
用urllib2、re、os 模組下載檔案的指令碼
!/usr/bin/env python
importurllib2
importre
importos
URL=’http://image.baidu.com/channel/wallpaper’
read=urllib2.urlopen(URL).read()
pat =re.compile(r’src=\’#\’” //.+?.js”>’)
urls=re.findall(pat,read)
fori inurls:
url=i.replace(‘src=\’#\’” /code>,”).replace(‘”>’,”)
try:
iread=urllib2.urlopen(url).read()
name=os.path.basename(url)
with open(name,’wb’) as jsname:
jsname.write(iread)
except:
printurl,”url error”
from:http://blog.csdn.net/pipisorry/article/details/45476817
python模組 - re模組