RE正则的常规用法
1.re的簡介 使用python的re模塊,盡管不能滿足所有復雜的匹配情況,但足夠在絕大多數(shù)情況下能夠有效地實現(xiàn)對復雜字符串的分析并提取出相關信息。python 會將正則表達式轉化為字節(jié)碼,利用 C 語言的匹配引擎進行深度優(yōu)先的匹配。
復制代碼 代碼如下: import re print re.__doc__
可以查詢re模塊的功能信息,下面會結合幾個例子說明。
2.re的正則表達式語法 正則表達式語法表如下:
| 語法 | 意義 | 說明 |
| "." | 任意字符 | ? |
| "^" | 字符串開始 | '^hello'匹配'helloworld'而不匹配'aaaahellobbb' |
| "$" | 字符串結尾 | 與上同理 |
| "*" | 0 個或多個字符(貪婪匹配) | <*>匹配<title>chinaunix</title> |
| "+" | 1 個或多個字符(貪婪匹配) | 與上同理 |
| "?" | 0 個或多個字符(貪婪匹配) | 與上同理 |
| *?,+?,?? | 以上三個取第一個匹配結果(非貪婪匹配) | <*>匹配<title> |
| {m,n} | 對于前一個字符重復m到n次,{m}亦可 | a{6}匹配6個a、a{2,4}匹配2到4個a |
| {m,n}? | 對于前一個字符重復m到n次,并取盡可能少 | ‘aaaaaa'中a{2,4}只會匹配2個 |
| "\\" | 特殊字符轉義或者特殊序列 | ? |
| [] | 表示一個字符集 | [0-9]、[a-z]、[A-Z]、[^0] |
| "|" | 或 | A|B,或運算 |
| (...) | 匹配括號中任意表達式 | ? |
| (?#...) | 注釋,可忽略 | ? |
| (?=...) | Matches if ... matches next, but doesn't consume the string. | '(?=test)'? 在hellotest中匹配hello |
| (?!...) | Matches if ... doesn't match next. | '(?!=test)'? 若hello后面不為test,匹配hello |
| (?<=...) | Matches if preceded by ... (must be fixed length). | '(?<=hello)test'? 在hellotest中匹配test |
| (?<!...) | Matches if not preceded by ... (must be fixed length). | '(?<!hello)test'? 在hellotest中不匹配test |
正則表達式特殊序列表如下:
| 特殊序列符號 | 意義 |
| \A | 只在字符串開始進行匹配 |
| \Z | 只在字符串結尾進行匹配 |
| \b | 匹配位于開始或結尾的空字符串 |
| \B | 匹配不位于開始或結尾的空字符串 |
| \d | 相當于[0-9] |
| \D | 相當于[^0-9] |
| \s | 匹配任意空白字符:[\t\n\r\r\v] |
| \S | 匹配任意非空白字符:[^\t\n\r\r\v] |
| \w | 匹配任意數(shù)字和字母:[a-zA-Z0-9] |
| \W | 匹配任意非數(shù)字和字母:[^a-zA-Z0-9] |
3.re的主要功能函數(shù)
??? 常用的功能函數(shù)包括:compile、search、match、split、findall(finditer)、sub(subn) compile re.compile(pattern[, flags]) 作用:把正則表達式語法轉化成正則表達式對象 flags定義包括: re.I:忽略大小寫 re.L:表示特殊字符集 \w, \W, \b, \B, \s, \S 依賴于當前環(huán)境 re.M:多行模式 re.S:' . '并且包括換行符在內的任意字符(注意:' . '不包括換行符) re.U: 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依賴于 Unicode 字符屬性數(shù)據庫
search re.search(pattern, string[, flags]) search (string[, pos[, endpos]]) 作用:在字符串中查找匹配正則表達式模式的位置,返回 MatchObject 的實例,如果沒有找到匹配的位置,則返回 None。
match re.match(pattern, string[, flags]) match(string[, pos[, endpos]]) 作用:match() 函數(shù)只在字符串的開始位置嘗試匹配正則表達式,也就是只報告從位置 0 開始的匹配情況,而 search() 函數(shù)是掃描整個字符串來查找匹配。如果想要搜索整個字符串來尋找匹配,應當用 search()。
下面是幾個例子: 例:最基本的用法,通過re.RegexObject對象調用
復制代碼 代碼如下: #!/usr/bin/env python import re r1 = re.compile(r'world') if r1.match('helloworld'): ??? print 'match succeeds' else: ??? print 'match fails' if r1.search('helloworld'): ??? print 'search succeeds' else: ??? print 'search fails'?
說明一下:r是raw(原始)的意思。因為在表示字符串中有一些轉義符,如表示回車'\n'。如果要表示\表需要寫為'\\'。但如果我就是需要表示一個'\'+'n',不用r方式要寫為:'\\n'。但使用r方式則為r'\n'這樣清晰多了。
例:設置flag
復制代碼 代碼如下: #r2 = re.compile(r'n$', re.S) #r2 = re.compile('\n$', re.S) r2 = re.compile('World$', re.I) if r2.search('helloworld\n'): ??? print 'search succeeds' else: ??? print 'search fails'例:直接調用
復制代碼 代碼如下: if re.search(r'abc','helloaaabcdworldn'): ??? print 'search succeeds' else: ??? print 'search fails'?
split re.split(pattern, string[, maxsplit=0, flags=0]) split(string[, maxsplit=0]) 作用:可以將字符串匹配正則表達式的部分割開并返回一個列表 例:簡單分析ip
復制代碼 代碼如下: #!/usr/bin/env python import re r1 = re.compile('W+') print r1.split('192.168.1.1') print re.split('(W+)', '192.168.1.1') print re.split('(W+)', '192.168.1.1', 1)結果如下: ['192', '168', '1', '1'] ['192', '.', '168', '.', '1', '.', '1'] ['192', '.', '168.1.1']
?
findall re.findall(pattern, string[, flags]) findall(string[, pos[, endpos]]) 作用:在字符串中找到正則表達式所匹配的所有子串,并組成一個列表返回 例:查找[]包括的內容(貪婪和非貪婪查找)
復制代碼 代碼如下: #!/usr/bin/env python import re r1 = re.compile('([.*])') print re.findall(r1, "hello[hi]heldfsdsf[iwonder]lo") r1 = re.compile('([.*?])') print re.findall(r1, "hello[hi]heldfsdsf[iwonder]lo") print re.findall('[0-9]{2}',"fdskfj1323jfkdj") print re.findall('([0-9][a-z])',"fdskfj1323jfkdj") print re.findall('(?=www)',"afdsfwwwfkdjfsdfsdwww") print re.findall('(?<=www)',"afdsfwwwfkdjfsdfsdwww")?
finditer re.finditer(pattern, string[, flags]) finditer(string[, pos[, endpos]]) 說明:和 findall 類似,在字符串中找到正則表達式所匹配的所有子串,并組成一個迭代器返回。同樣 RegexObject 有:
sub re.sub(pattern, repl, string[, count, flags]) sub(repl, string[, count=0]) 說明:在字符串 string 中找到匹配正則表達式 pattern 的所有子串,用另一個字符串 repl 進行替換。如果沒有找到匹配 pattern 的串,則返回未被修改的 string。Repl 既可以是字符串也可以是一個函數(shù)。 例:
復制代碼 代碼如下: #!/usr/bin/env python import re p = re.compile('(one|two|three)') print p.sub('num', 'one word two words three words apple', 2)?
subn re.subn(pattern, repl, string[, count, flags]) subn(repl, string[, count=0])
說明:該函數(shù)的功能和 sub() 相同,但它還返回新的字符串以及替換的次數(shù)。同樣 RegexObject 有:
轉載于:https://www.cnblogs.com/weiming-cheng/p/4957347.html
總結
- 上一篇: 几个英文词汇对照
- 下一篇: iOS将产品进行多语言发布,开发