正則表達式筆記

Table:

literal: 普通的逐字匹配.
"|": 該操作符具有延伸性(貪婪),例: at|home 匹配的是at或home,而不是t或h.
'.': 任意一個字符(不含\n)
"^": 匹配字符串起始部分
"$": 匹配字符串結束部分
"": 匹配0次或多次前面出現的表達示,只對前一位有效(非延展),重複次數含前面的字符, 如果樣本爲:"aga23gaafa",那把表達式r"8"是能匹配到內容的,內容是NONE,因爲這個表達式8如果按重複0次算本身就是NONE.
"+": 匹配1次或多次前面出現的表達式,只對前一位有效(非延展),重複次數注意事項同上.
"?": 匹配0次或1次前面出現的表達式,只對前一位有效(非延展),重複次數注意事項同上.
"?": ?同時還被重載賦以另一個含義: 當'?'用在閉合操作符後面,它將要求正則引擎儘可能少的匹配. (
和+是閉合操作符),如: 3+含義爲: 3或33或333或3333..., 如果是3+?意思爲: 3 (取最不貪婪的值,讓"+"代表重複一次的含義).

"{N}": 匹配之前的字符N次, N次包含了前面字符本身(非延展).如: 53{2}就是匹配"533"的意思.
"{MN}": 匹配之前字符N-M次,其它同上.
"[...]": 匹配字符集內的任一字符.如:[mark]匹配m或a或r或k
"[x-y]": 匹配字符集內一個區間,如:[a-zA-Z]
"(...)": 封閉正則

'\d': 任意十進制數, '\D'相反
'\w': 任意字母或數字(和[a-zA-Z0-9]同意), '\W'相反
'\s': 匹配空格,tab等. '\S'相反.
'\b': 匹配單詞邊界,'\B'相反. 就是[a-zA-Z0-9]與[^a-zA-Z0-9]之間的邊界內容.如:我希望在字符串"give me the themometer"中匹配單詞'the' 應該使用"\bthe\b".
'\N': 匹配己保存的子組.
'\charactor': 轉義特殊字符爲本身, "\?"就是?號本身.

re module:
re.match(pattern,string,flag) //從字符串開始匹配
re.search(pattern,string,flag) //從字符串中間開始匹配(只匹配首次出現並符合條件的字符內容)

matched object:
    m.group(index)  //如果是參數index爲0或無參數, 返回整個配置結果,如果index爲>=1,則返回相應子組的配置內容.
    m.groups()以一個tuple的形式返回所有子組(子組作爲tuple中的元素返回)

re.findall(pattern,string,flag)  //工作方式和search相同,但是返回一個list, 1.如果只成功匹配一次,那麼所有子組爲list中的元素. 2.如果多次成功匹配,list由元組構成,每一次成功匹配是list中的一個tuple, 每一個成功匹配的子組爲List中的tuple中的元素.

re.finditer(pattern,string,flag) //工作方式和search相同,但是返回內容爲一個包含matched object的迭代器.

re.sub(pattern,new_str,string)  //使用new_str替代匹配pattern的string中的內容.返回值爲替換後的string.
re.subn(pattern,new_str,string)  //工作內容和re.sub相同,返回值爲一個包含2個元素的tuple,  tuple[0]爲替換後的新字符串, tuple[1]爲替換的次數.
注: 可以使用\N指定匹配的某子組作爲替換內容.(N爲pattern的子組編號)
例: re.sub(r'(\d{1,2})/(\d{1,2})/(\d{2}|\d{4})', r'\2/\1/\3', 2/20/1991),意思是把MM/DD/YYYY換成DD/MM/YYYY的時間格式.

re.split(pattern,string)  //使用pattern作爲分隔符對原字符串進行分割,分割後的元素形成一個List並返回.

擴展符:
    (?i) //忽略大小寫  (?m) //允許多行
    (?=xxx)  //正向前視斷言, 要匹配的內容後邊必須有xxx跟隨.  
        例:  "0 input errors, 0 CRC, 0 frame, 0 overrun, 0 "  如果我想匹配CRC之前的數字,但匹配內容不想含CRC, 那麼pattern爲 r'\d+(?=\sCRC)'
    (?!xxx)  //負向前視斷言, 要匹配的內容後邊必須沒有xxx跟隨.
    (?<=xxx) //正向後視斷言, 要匹配的內容前邊必須有xxx.
        例: 'MTU 1500 bytes, BW 100000 Kbit, DLY 100 usec', 如果我想匹配BW之後的數字,但匹配內容不包含BW,那麼pattern爲 r'(?<=BW\s)\d+'
    (?<!xxx) //負向後視斷言, 要匹配的內容前邊必須沒有xxx.

貪婪:正則表達式本質上實現貪婪,對於通配符模式,將對正則表達式從左至右按順求值,並且試圖獲取儘可能多的字符.
    例:"abcdefghi1234-56-789" 如果Pattern爲r'(\w+)(\d+-\d+-\d+)'那麼group(1)的內容爲:'abcdefghi123' group(2)內容爲:'4-56-789', 結果可能不是我們要的,但是因爲貪婪原則,正則引擎爲讓(\w+)匹配更多內容.
非貪婪?:  可以在'+','*','?'之後使用非貪婪操作符'?'進行約束,要求儘可能少匹配, 同上例: 如果我們使用Pattern爲: r'(\w+?)(\d+-\d+-\d+)', 那麼group(1)匹配內容爲:'abcdefghi', group(2)匹配內容爲:'1234-56-789'. 可能更加符合預期.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章