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