正则表达式
正则表达式
又称规则表达式
通常被用来检索、替换那些符合某个模式(规则)的文本
-给定的字符串是否符合正则表达式的过滤逻辑(匹配)
-通过正则表达式,从字符串中获取我们想要的特定的部分
使用场景:
-爬虫
-数据挖掘和分析
假如在字符串 ‘asd23sd5fgg67’ 中提取23,5,6 如何实现
import re a='as23d5s67' m=r'[0-9]+' num=re.findall(m,a) print(num) #['23', '5', '67']
在
hello world 18111234589name:张三,tel:18711001111a='<table><tr>hello world 18111234589<tr><tr><span>name:张三,tel:18711001111</span></tr></table>' start=a.find('<span>') end=a.find('</span>') print(a[start+len('<span>'):end])
re.match(pattern,string,flag=0)
-作用:从字符串的开头开始匹配一个模式
*匹配成功则返回匹配成功的对象
*否则,返回None
-参数说明:
pattern是匹配规则
string是要匹配的字符串
flag:标志位,用于控制正则表达式的匹配方式。比如是否匹配多行,是否区分大小写
re.group([group1,…]) 字符串或者元组
-作用:获得一个或多个分组截获的字符串
-指定多个参数时就会以元组形式返回
-group1可以使用编号,也可以使用别名
-编号0代表匹配整个字符串,默认返回group(0)
-如果没有截获字符串,返回None
-截获了多次的组,返回最后一次截获的字符串
re.groups([default=None])tuple
-作用:以元组形式返回全部分组截获的子串。类似调用re.group(1,2…,last)
-如果没有截获字符串的组,默认返回None
re.search(pattern,str,flags=0)
-作用:扫描整个字符串,返回第一次成功匹配的对象
-如果匹配失败,返回None
import re print(re.search('a','Aliyun is a').group()) print(re.search('yun','Aliyun is a').group()) print(re.search('yun','Aliyu n is a').group()) 输出: a yun 报错
re.findall(pattern,str,flags=0)
-作用:获取字符串所有匹配的子串,并以列表形式返回
re.finditer(pattern,str,flags=0)
作用:获取字符串所有匹配的字串,并返回一个迭代器
re.search和re.match区别**
-re.match()从字符串开头开始匹配,如果失败返回None
-re.search()匹配整个字符串,直到找到一个匹配,失败反回None
单字符匹配规则
字符 | 功能 |
---|---|
. | 匹配任意一个字符(除了\n) |
[] | 匹配[]中列举的字符 |
\d | 匹配数字(0-9) |
\D | 匹配非数字 |
\w | 匹配字符(A-Z , a-z , 0-9 , _) 跟变量名一样 |
\W | 取\w的反 |
\s | 匹配空白字符,比如空格、\tab |
demo:
正则表达式: .
import re m=re.match('.','a') print(m.group()) m=re.match('.','abc') print(m.group()) m=re.match('.','\n') print(m.group()) 输出: a a 报错
正则表达式:[]
import re m=re.match('[c]','city') print(m.group()) m=re.match('[Cc]','City') print(m.group()) m=re.match('[0-9]','66city') print(m.group()) 输出: c C 6
正则表达式:\d \D
import re m=re.match(r'\d','66city') #最好加上r,因为有时候 print(m.group())
数量匹配规则
字符 | 功能 |
---|---|
* | 匹配前一个字符出现0次多次或者无限次,可有可无,可多可少 |
+ | 匹配前一个字符出现1次多次或无限次,直到出现一次 |
? | 匹配前一个字符出现1次或0次,要么有1次,要么没有 |
{m} | 匹配前一个字符出现m次 |
{m,} | 匹配前一个字符至少出现m次 |
{m,n} | 匹配前一个字符出现m到n次 |
import re m=re.match('[A-Z][a-z]*','Aasd') print(m.group()) m=re.match('[A-Z][a-z]*','AAasd') print(m.group()) 输出: Aasd A
import re pattern=input('输入匹配规则:') sr=input('输入匹配字符串') m=re.match(pattern,sr) print(m.group()) #输入匹配规则:1[35678]\d{9} #输入匹配字符串13423456789 #13423456789
表示边界
字符 | 功能 |
---|---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
\b | 匹配一个单词的边界 |
\B | 匹配非单词的边界 |
匹配分组
字符 | 功能 |
---|---|
| | 匹配左右任意一个表达式 |
(ab) | 将括号中的字符作为一个分组 |
\num | 引用分组num匹配到的字符串 |
(?P) | 分组起别名 |
(?P=name) | 引用别名为name分组匹配到的字符串 |
import re pattern='<h1>(.*)<h1>' #分组 sr='<h1>hello world!<h1>' m=re.match(pattern,sr) print(m.group()) print(m.group(1)) 输出: <h1>hello world!<h1> hello world!