pythonre正则表达式1012pythonre正则表达式_python re模块 正则表达式
正則表達(dá)式在很多語(yǔ)言里都支持,python也不例外,re模塊就是正則表達(dá)式的應(yīng)用
正則表達(dá)式對(duì)字符串的邏輯操作,主要是對(duì)字符串的一種過(guò)濾,用“元字符” 與“普通字符”組成一個(gè)字符串規(guī)則對(duì)已知的字符串或文本過(guò)濾出自己想要的字符串
1、正則表達(dá)式元字符 \ 轉(zhuǎn)義字符,將后邊緊跟著的字符變成特殊字符,或?qū)⒑筮叺奶厥庾址兂善胀ㄗ址?/p>
如:在正則表達(dá)式中,"\n"換行符,"\\"則代表一個(gè)普通字符"\"
^ 匹配第一行行首,匹配多行需要傳參 flags=re.MULTILINE
$ 匹配最后一行行尾,匹配多行需要傳參 flags=re.MULTILINE
. 除"\r""\n"外,匹配任意的單個(gè)字符,要使"."匹配換行符,flags=re.DOTALL
| 或,如 "aaa|bbb|ccc",表示"aaa","bbb","ccc"三選一
? 匹配前邊的子表達(dá)式0次或1次,等價(jià)于{0,1}
+ 匹配前邊的子表達(dá)式1次或多次,等價(jià)于{1,}
* 匹配前邊的子表達(dá)式0次或多次,,等價(jià)于{0,}
{} {n}匹配前邊的子表達(dá)式n次,{n,}匹配前邊的子表達(dá)式至少n次 即:>= n,{n,m}匹配前邊的子表達(dá)式n~m次,即:n<= 表達(dá)式 <=m
() 分組,從1開始,從左至右數(shù)"("為第幾組,下標(biāo)0為全部分組
[] 字符集匹配[]中的人一個(gè)字符,之匹配一次,如[abc]:表示"a","b","c"三選一。也可以給定范圍(必須是連續(xù)的才行),如[a-z]:表示a到z任意一個(gè)字符。
還可以取反,如[^abc]:除"a","b","c"外的任意字符。注:[]中只有"^","-","\"三個(gè)特殊字符,其中"\"代表轉(zhuǎn)義字符,其它的都代表原本普通的字符,如:[.]只是一個(gè)普通的點(diǎn)字符
?:要使用元字符本身的普通字符,請(qǐng)使用轉(zhuǎn)義字符轉(zhuǎn)義一下,如 :"\(" 在正則表達(dá)式中代表普通給"("字符,其它的雷同
分組的用法: (\num) 引用指定第幾分組的值
(?P) 指定分組別名"name"
(?P=name) 引用指定別名的分組的值
(?:) 相當(dāng)于去分組化,變成"與"()子集,如:"abc(?:qqq|www)"-->相當(dāng)于"abcqqq|abcwww"
(具體用法請(qǐng)看下邊(search函數(shù)))
2、預(yù)定義字符集 \b 匹配一個(gè)單詞邊界,也就是指單詞和空格間的位置,其它特殊字符也可以是單詞的邊界,如"#","$","&","*"等
\B 匹配非單詞邊界
\d 匹配一個(gè)數(shù)字字符。等價(jià)于[0-9]
\D 匹配一個(gè)非數(shù)字字符。等價(jià)于[^0-9
\s 匹配任何不可見(jiàn)字符,包括空格、制表符、換頁(yè)符等,等價(jià)于[ \f\n\r\t\v]
\S 匹配任何可見(jiàn)字符。等價(jià)于[^ \f\n\r\t\v]
\w 匹配包括下劃線的任何單詞字符。這里的"單詞"字符使用Unicode字符集,類似但不等價(jià)于“[A-Za-z0-9_]”,還包含漢字等它國(guó)字符
\W 匹配任何非單詞字符。這里的"單詞"字符使用Unicode字符集,類似但不等價(jià)于“[^A-Za-z0-9_]”,還包含漢字等它國(guó)字符
在這里我要先說(shuō)明一下 flags 的用法 使用ASCII字符集進(jìn)行匹配(不常用)
忽略大小寫匹配
re.L 或 re.LOCALE 使用當(dāng)前預(yù)定字符類 \w \W \b \B \s \S 取決于當(dāng)前區(qū)域設(shè)定(不常用)
re.U 或 re.UNICODE 使用Unicode字符類 \w \W \b \B \s \S \d \D 取決于unicode定義的字符屬性(不常用)
re.M 或 re.MULTILINE 多行匹配,使"^","$"可以在每一行中都進(jìn)行匹配
re.S 或 re.DOTALL 使 "." 可以匹配換行符"\r","\n"
re.X 或 re.VERBOSE 去掉正則表達(dá)式中的所有空格符(不常用)
1)re.findall(pattern, string, flags=0)
按照規(guī)則匹配整個(gè)字符串,返回匹配結(jié)果的列表
1 >>> re.findall(r"hello", "hello world hello") # 普通匹配 2 ['hello', 'hello'] 3 >>> re.findall(r"^hello", "hello world hello") # 匹配開頭 4 ['hello'] 5 >>> re.findall(r"^hello", "hello world\nhello", flags=re.MULTILINE) # 多行匹配開頭 6 ['hello', 'hello'] 7 >>> re.findall(r"hello$", "hello world hello") # 匹配結(jié)尾 8 ['hello'] 9 >>> re.findall(r"\d+", "aaa111bbb222ccc333") # 匹配數(shù)字 10 ['111', '222', '333'] 11 >>> re.findall(r"\d{2}", "aaa111bbb222ccc333") # 匹配兩位的數(shù)字 12 ['11', '22', '33'] 13 >>> re.findall(r"ab|cd", "ab000cd00") # 匹配"ab"或"cd" 14 ['ab', 'cd'] 15 >>> re.findall(r"\(", "ab(cd")) # 匹配"(" 16 ['('] 17 18 >>> re.findall(r"(abc)+", "abcabcabc") # 想要匹配多個(gè)"abc",使用分組時(shí)會(huì)優(yōu)先把分組的內(nèi)容返回 19 ['abc'] 20 >>> re.findall(r"(?:abc)+", "abcabcabc") # 想要匹配多個(gè)"abc",(?:)把分組去掉,變成一個(gè)普通的字符串 21 ['abcabcabc']
2)re.finditer(pattern, string, flags=0)
finditer與findall相似,只不過(guò)finditer返回一個(gè)迭代器,迭代器中每一個(gè)元素都是re.Match對(duì)象,通過(guò)group()可以獲取值
1 r = re.finditer("hello", "hello world hello") 2 for i in r: 3 print(i.group()) 4 5 # 輸出結(jié)果 6 hello 7 hello
3)re.search(pattern, string, flags=0)
search函數(shù)只返回第一個(gè)匹配到的結(jié)果,成功返回re.Match對(duì)象,否則返回None。
1 >>> re.search(r"hello", "hello world hello") 2 <_sre.sre_match object span="(0," match="hello"> # 可以看到只返回了第一個(gè)"hello" 3 >>> re.search(r"hello", "hello world hello").group() 4 'hello' 5 6 >>> re.search(r"(abc) \1", "abc abc").group() # \1 引用分組1的值 7 'abc abc' 8 >>> re.search(r"(?Pabc) (?P=name)", "abc abc").group() # (?P=name) 引用分組別名"name"的值 9 'abc abc' 10 11 >>> re.search(r"(?Pzhansan) (?P23)", "zhansan 23").group() 12 'zhansan 23' 13 >>> re.search(r"(?Pzhansan) (?P23)", "zhansan 23").group(0) # 分組0--即匹配的結(jié)果 14 'zhansan 23' 15 >>> re.search(r"(?Pzhansan) (?P23)", "zhansan 23").group(1) # 分組1的值 16 'zhansan' 17 >>> re.search(r"(?Pzhansan) (?P23)", "zhansan 23").group(2) # 分組2的值 18 '23' 19 >>> re.search(r"(?Pzhansan) (?P23)", "zhansan 23").group("name") # 分組別名name的值 20 'zhansan' 21 >>> re.search(r"(?Pzhansan) (?P23)", "zhansan 23").group("age") # 分組別名age的值 22 '23'
4)re.match(pattern, string, flags=0)
match從開始處進(jìn)行匹配,成功返回re.Match對(duì)象,否則返回None。類似于于findall代碼中的第3行
1 >>> re.findall(r"^abc", "abcooooo") 2 ['abc'] 3 >>> re.match(r"abc", "abcooooo").group() 4 'abc'
5)re.sub(pattern, repl, string, count=0, flags=0)
sub按照給定的規(guī)則將string字符串中的相應(yīng)的片段替換為repl,count 最多替換的次數(shù),count=0默認(rèn)為全部替換,返回替換后的字符串
1 >>> re.sub(r"\d+", "$", "aaa1bb2ccc333") # 將連續(xù)的數(shù)字變成"$" 2 'aaa$bb$ccc$'
6)re.subn(pattern, repl, string, count=0, flags=0)
與sub相識(shí),count 最多替換的次數(shù),count=0默認(rèn)為全部替換,返回 一個(gè)元組,下標(biāo)0為替換后的字符串,下標(biāo)1成功替換的次數(shù)
1 >>> re.subn(r"\d+", "$", "aaabbccc") 2 ('aaabbccc', 0) 3 >>> re.subn(r"\d+", "$", "aaa11bb22ccc") 4 ('aaa$bb$ccc', 2) 5 >>> re.subn(r"\d+", "$", "aaa11bb22ccc", 1) # 最多替換1次 6 ('aaa$bb22ccc', 1) 7 >>> re.subn(r"\d+", "$", "aaa11bb22ccc", 10) # 最多替換10次 8 ('aaa$bb$ccc', 2) # 成功替換2次
7)re.split(pattern, string, maxsplit=0, flags=0)
通過(guò)給定規(guī)則,將string進(jìn)行切割,maxsplit最多切割次數(shù),maxsplit=0默認(rèn)全部切割,返回
1 >>> re.split(r"@", "a#b#c#d#e") # 沒(méi)有找到"@",不切割 2 ['a#b#c#d#e'] 3 >>> re.split(r"#", "a#b#c#d#e") # 按"#"對(duì)字符串進(jìn)行切割 4 ['a', 'b', 'c', 'd', 'e'] 5 >>> re.split(r"#", "a#b#c#d#e", 2) # 按"#"對(duì)字符串進(jìn)行切割,最多切割2次 6 ['a', 'b', 'c#d#e']
8)re.compile(pattern, flags=0)
返回一個(gè)正則表達(dá)式的對(duì)象
1 >>> rg = re.compile(r"\d+", flags=0) 2 >>> re.findall(rg, "a1bb22ccc333") 3 ['1', '22', '333']
總結(jié)
以上是生活随笔為你收集整理的pythonre正则表达式1012pythonre正则表达式_python re模块 正则表达式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 上班族和学习党要保护好肩颈腰椎
- 下一篇: python 只能将最后一行写入exce