Python学习20——re模块
re模块
常用匹配模式表
模式 | 描述 |
---|---|
\w | 匹配字符数字及下划线 |
\W | 匹配非字母数字下划线 |
\s | 匹配任意空白字符,等价与[\t\n\r\f] |
\S | 匹配任意非空白字符 |
\d | 匹配任意数字,等价于[0-9] |
\D | 匹配任意非数字 |
\A | 匹配字符串开始 |
\Z | 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串 |
\z | 匹配字符串结束 |
\G | 匹配最后匹配完成的位置 |
\n | 匹配一个换行符 |
\t | 匹配一个制表符 |
^ | 匹配字符串开头 |
$ | 匹配字符串末尾 |
. | 匹配任意字符,除了换行符,当 re.DOTALL 标记被指定时,则可以匹配包括换行符的任意字符 |
[…] | 用来表示一组字符,单独列出:[amrk]匹配’a’,‘m’或’k’ |
[^…] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符 |
* | 匹配0个或者多个的表达式 |
+ | 匹配1个或者多个的表达式 |
? | 匹配0个或者1个由前面的正则表达式定义的片段,非贪婪方式 |
{n} | 精确匹配 n 个前面表达式 |
{n,m} | 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式 |
a丨b | 匹配 a 到 b |
() | 匹配括号内的表达式,也表示一个组 |
正则表达式:
由一系列特殊字符拼接而成的表达式/规则,该表达式用于从一个大字符串中匹配出符合规则的子字符串
详解
import re
1、\w : 匹配字母数字及下划线
print(re.findall('\w','h ell o haha_ 0)! 2254 #886'))
2、\W : 匹配非字母数字下划线
print(re.findall('\w','h ell o haha_ 0)! 2254 #886'))
3、 \s :匹配任意空白字符,等价于[\t\n\r\f]
print(re.findall('\w','h ell o haha_ 0)! 2254 #886'))
4、 \S :匹配任意非空字符
print(re.findall('\w','h ell o haha_ 0)! 2254 #886'))
5、 \d :匹配任意数字
print(re.findall('\w','h ell o haha_ 0)! 2254 #886'))
6、 \D :匹配任意非数字
print(re.findall('\w','h ell o haha_ 0)! 2254 #886'))
组合
print(re.findall('a\sd','h ell o hah\na_ 0)! 22\t54 #886 aada da d adada dada dsc '))
7、 \n 与 \t : 匹配一个换行符 或 一个制表符
msg = """
he\tll\n\no 123_ )0
\t1
2
\t3
"""
print(re.findall('\n', msg))
print(re.findall('\t', msg))
8、^ 与 $ :匹配字符串的开头 或 匹配字符串的末尾
print(re.findall('^egon', 'egon sadf 5465413 egon dasfefscccxegon'))
print(re.findall('egon$', 'egon sadf 5465413 egon dasfefscccxegon'))
print(re.findall('^a\w\w\wc$', 'a213c')) # 总长度为5个
9、| . | [] | * | ? | .*? | + | {n,m} |
9.1 . :匹配任意一个字符,换行符除外
print(re.findall("a\db", "a2b a1b aab aaaaaaaab a+b a-b a\nb a\tb a c"))
print(re.findall("a\wb", "a2b a1b aab aaaaaaaab a+b a-b a\nb a\tb a c"))
print(re.findall("a.b", "a2b a1b aab aaaaaaaab a+b a-b a\nb a\tb a c"))
print(re.findall('a.b', 'a2b a1b aab aaaaaaaab a+b a-b a\nb a\tb a c', re.DOTALL)) # re.DOTALL '.'可以代表所有
9.2 []:代表匹配一个字符,可以指定该字符的范围
print(re.findall("a[+-]b", "a2b a1b aab aaaaaaaab a+b a-b a\nb a\tb a c"))
print(re.findall("a[.*/+-]b", "a2b a*b a1b aab a*aaa/aaaab a.b a/b a+b a-b a\nb a\tb a c"))
print(re.findall("a[0-9]b", "a2b a1b aab aaaaaaaab a+b a-b a\nb a\tb a c"))
9.3 *:匹配0次或者多次
print(re.findall("ab*","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
9.4 +:左边那个字符出现1次或者无穷次
print(re.findall("ab+","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
9.5 {n,m}: 左边那个字符出现n次到m次
print(re.findall("ab{0,}","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
print(re.findall("ab*","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
print(re.findall("ab{1,}","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
print(re.findall("ab+","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
print(re.findall("ab{2,5}","a ab abb abbb abbbb abbbbbbbb abbbbbbbbbbbb bbbbbbbbb"))
9.6 ?:左边那个字符出现0次到1次
print(re.findall("ab?","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
9.7 .*:匹配所有
print(re.findall("a.*b", "123 a1231-==-000b123123123123123b"))
print(re.findall("a.*?b", "123 a1231-==-000b123123123123123b")) # 非贪婪式
例1:
msg='<a href="https://pan.baidu.com/s/1skWyTT7" target="_blank"><strong><span style="color: #ff0000;">原理图:https://pan.baidu.com/s/1skWyTT7</span></strong></a><a href="https://www.baidu/com">"点我啊"</a>'
print(re.findall('href=".*?"',msg))
print(re.findall('href="(.*?)"',msg))
例2:
print(re.findall("a.*b","a1b a+b a-b a\nb a\tb",re.DOTALL))
10 ():分组
print(re.findall('ab+','ababab123')) #['ab', 'ab', 'ab']
print(re.findall('(ab)+123','ababab123')) #['ab'],匹配到末尾的ab123中的ab
10.1 取消分组
print(re.findall('(?:ab)+123','ababab123')) #findall的结果不是匹配的全部内容,而是组内的内容,?:可以让结果为匹配的全部内容
11 |:或者
print(re.findall("compan(?:ies|y)","Too many companies have gone bankrupt, and the next one is my company'"))
Too many companies have gone bankrupt, and the next one is my company
compan(ies|y)
print(re.findall("\d+\.?\d*", "as9fdasldf1111asdf3333dfadf3.4dafadf3.5555asdfsafd.5555"))
-
\
print(re.findall(‘a\\c’, ‘a\c alc aac’))
re模块提供的方法介绍
方法 | 介绍 |
---|---|
re.findall | 返回所有满足匹配条件的结果,放在列表里 |
re.search | 只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。 |
re.match | 同search,不过在字符串开始处进行匹配,完全可以用search+^代替match |
re.split | 进行切割 |
详解
import re
#1、re.findall
print(re.findall('e','alex make love') ) #['e', 'e', 'e']
#2、re.search
print(re.search('e','alex make love')) #<re.Match object; span=(2, 3), match='e'>
print(re.search('e','alex make love').group()) #['e']
#3、re.match
print(re.match('e','alex make love')) #None
#4、re.split
print(re.split('[ab]','abcd')) #['', '', 'cd']