python 正則(re)

python re 模塊。
在python docs中,這些內容基本都是成對出現的。但是基本是反義的意思。比如\w 和 \W,\d \D。主要是 \w 和 \W 這兩個內容。首先是 \w,這個可以匹配[a-zA-Z_0-9] 這些內容。這些東西正好是組成變量名的元字符。所以我相匹配所有的合法的變量名,那麼我可以用這個模式來匹配。 obj = re.compile('\w*'); 這樣就可以找到一行代碼中的所有的變量名了。然後再用 obj.findall('a+b+c+__c');基本上可以找出一個表達式中所有的變量名了。如果不是用re來完成,這樣的任務應該也很麻煩。

* ? + . ^ $ 這幾個符號都是很重要很基本的,首先他們是代表什麼含義要明白。這些在python docs 中都又很詳細的描述,?表示0個或多個,+表示1個或多個。.表示任何符號,^表示字符串的開頭,$表示字符串的結尾。問號還可以表示是非貪婪匹配的意思。
targ = '3.23+4.42-16.8877*123'
ob = re.compile('\d+[\.]?\d+')
ob.findall(targ) 可以找出所有的數字。
我感覺 括號的實用還是很詭異的呀,所以不太好搞明白啊。
ss = 'new2012,bay2013'
ob = re.compile('[a-z]*\d*\d')
好好想一下這些是怎麼回事。我還是沒有搞明白括號的用法。但是從下面這個例子可以說明一些問題。
text = "Professor Abdolmalek, please report your absences promptly."
re.findall(r"(\w)(\w+)(\w)", text)

def repl(m): 
    inner_word = list(m.group(2)) 
    random.shuffle(inner_word) 
    return m.group(1) + "".join(inner_word) + m.group(3)

text = "Professor Abdolmalek, please report your absences promptly."
re.sub(r"(\w)(\w+)(\w)", repl, text)

'Pofsroser Aodlambelk, plasee reoprt yuor asnebces potlmrpy.'


下面這個可以找到字符串中長度爲2 或 3 的字符串。並且我發現如果不加上r這個字符的話,是得不到正確結果的。r表示raw string 的意思。因爲在裏面用到了不少的字符,這些都是需要轉義纔可以正常匹配的,當然這樣的話就非常麻煩,加上r之後,就可以避免這些麻煩的轉義符了。

下面的例子是找出長度爲 1  和長度 爲2 的單詞。結果就是 he 和 i。

ss = 'new2012,bay2013 he hehehe i sss'
ob = re.compile(r'\b[a-z]{1,2}\b')


基本上就是這樣的,具體的可以再參考具體的文檔。現在這個模塊基本上比較熟悉了。下面的這個例子也比較經典。出了findall之外,finditer也是比較合理的。

text = "He was carefully disguised but captured quickly by police." 
for m in re.finditer(r"\w+ly", text):
    print '%02d-%02d'%(m.start(),m.end(),m.group(0))
這樣就可以找到所有的副詞了。對於正則,總之需要多練習,才能在工作中比較熟練的使用。多看一些例子還是很有用的,就算是這些特殊字符。比如說 \n \t 之類的,通過正則消除掉沒用的空行,這都是很容易做到的。
發佈了42 篇原創文章 · 獲贊 6 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章