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