在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.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 之類的,通過正則消除掉沒用的空行,這都是很容易做到的。