1. 基本概念
正则表达式是对**字符串**操作的一种**逻辑公式**,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种逻辑过滤(模糊匹配)。
2. 常用元字符
- ^:以‘什么’开始
import re #正则表达式模块
string='jy2018/4/30jy'
re_srt=re.match('^jy',string).group() #是否以jy开始
print(re_srt)
- $:以‘什么’结尾
import re #正则表达式模块
string='jy2018/4/30jy'
re_srt=re.findall('jy$',string) #是否以jy结尾
print(re_srt)
- 增添:match和findall的区别
match:match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。用group(num=0)或groups()来获取匹配的结果
findall:返回string中所有与pattern相匹配的全部字串,返回形式为数组。
- .:除了换行符以外的任何字符
import re #正则表达式模块
string='jy\t\n2018/4/30jy'
re_srt=re.findall(r'...',string)
print(re_srt)
#结果
['jy\t', '201', '8/4', '/30']
- *:代表前面的规则出现的次数,至少0次
import re #正则表达式模块
string='jy\t\n2018/4/30jy'
re_srt1=re.findall('.',string)
re_srt2=re.findall('.*',string)
re_srt3=re.findall('...',string)
re_srt4=re.findall('...*',string)
print(re_srt1)
print(re_srt2)
print(re_srt3)
print(re_srt4)
#结果
['j', 'y', '\t', '2', '0', '1', '8', '/', '4', '/', '3', '0', 'j', 'y']
['jy\t', '', '2018/4/30jy', ''] #有空格
['jy\t', '201', '8/4', '/30']
['jy\t', '2018/4/30jy']
- +:代表前面的规则出现的次数,至少1次
import re #正则表达式模块
string='jy\t\n2018/4/30jy'
re_srt1=re.findall('.',string)
re_srt2=re.findall('.+',string)
re_srt3=re.findall('...',string)
re_srt4=re.findall('...+',string)
print(re_srt1)
print(re_srt2)
print(re_srt3)
print(re_srt4)
#结果
['j', 'y', '\t', '2', '0', '1', '8', '/', '4', '/', '3', '0', 'j', 'y']
['jy\t', '2018/4/30jy'] #没有空值
['jy\t', '201', '8/4', '/30']
['jy\t', '2018/4/30jy']
- ?:代表非贪婪匹配(从后往前)
import re #正则表达式模块
string='jy\t\n2018/4/30jyefw、///\t\n\gsg'
re_srt1=re.findall(r'.',string)
re_srt2=re.findall(r'.*',string)
re_srt3=re.findall(r'.+',string)
re_srt4=re.findall(r'.+?',string)
print(re_srt1)
print(re_srt2)
print(re_srt3)
print(re_srt4)
#结果
['j', 'y', '\t', '2', '0', '1', '8', '/', '4', '/', '3', '0', 'j', 'y', 'e', 'f', 'w', '、', '/', '/', '/', '\t', '\\', 'g', 's', 'g']
['jy\t', '', '2018/4/30jyefw、///\t', '', '\\gsg', '']
['jy\t', '2018/4/30jyefw、///\t', '\\gsg']
['j', 'y', '\t', '2', '0', '1', '8', '/', '4', '/', '3', '0', 'j', 'y', 'e', 'f', 'w', '、', '/', '/', '/', '\t', '\\', 'g', 's', 'g']
- |:或者
import re #正则表达式模块
string='jy\t\n2018/4/30jyefw、///\t\n\gsg'
re_srt1=re.findall('jy|2018',string)
print(re_srt1)
#结果
['jy', '2018', 'jy']
- \d:数字0-9
import re #正则表达式模块
string='jy\t\n2018/4/30jyefw、///\t\n\gsg'
re_srt1=re.findall('\d+',string) #是数字且数字出现大于等于一次就拿出来(贪婪匹配,从前往后)
print(re_srt1)
#结果
['2018', '4', '30']
- \s:特殊符号(具有特定含义的字符串)(大写是相反的关系)
正常字符:a-z,0-9
import re #正则表达式模块
string='jy\t\n2018/4/30jyefw、///\t\n\gsg'
re_srt1=re.findall('\s+',string)
print(re_srt1)
#结果
['\t\n', '\t\n']
- \w:普通字符:a-z,0-9
import re #正则表达式模块
string='jy\t\n2018/4/30jyefw、///\t\n\gsg'
re_srt1=re.findall('\w',string)
print(re_srt1)
#结果
['j', 'y', '2', '0', '1', '8', '4', '3', '0', 'j', 'y', 'e', 'f', 'w', 'g', 's', 'g']
- ():代表分组,也代表我们要取出的内容
import re #正则表达式模块
string='jy\t\n2018/4/30jy2018efw、///\t\n\gsg2018'
re_srt1=re.findall('.*y(2018).*?',string)
print(re_srt1)
#结果
['2018']
- []在括号中的字符都是或的关系,并且在括号中都没特殊含义
import re #正则表达式模块
string='jy\t\n2018/4/30jy2018efw、///\t\n\gsg2018'
re_srt1=re.findall('[a-z0-9]',string) #等同于\w,中间不能写逗号
print(re_srt1)
#结果
['j', 'y', '2', '0', '1', '8', '4', '3', '0', 'j', 'y', '2', '0', '1', '8', 'e', 'f', 'w', 'g', 's', 'g', '2', '0', '1', '8']
- [^]:除了在括号中的内容都可以
import re #正则表达式模块
string ='jy\t\n2018/4/30jy2018efw、///\t\n\gsg2018'
re_srt1 = re.findall('[^0-9]', string)
print(re_srt1)
#结果
['j', 'y', '\t', '\n', '/', '/', 'j', 'y', 'e', 'f', 'w', '、', '/', '/', '/', '\t', '\n', '\\', 'g', 's', 'g']
- {n}:代表匹配规则的重复次数(\n不能出现)
import re #正则表达式模块
string ='jy\t\n2018/\t4/30jy2018efw\t\ngsg2018'
re_srt1 = re.findall('.{4}', string)
re_srt2 = re.findall('.{4,8}', string) #最少出现4次,最多出现8次
print(re_srt1)
print(re_srt2)
#结果
['2018', '/\t4/', '30jy', '2018', 'efw\t', 'gsg2']
['2018/\t4/', '30jy2018', 'efw\t', 'gsg2018']
- 举例:
a='xiaoming出生1980年5月21号'
b='xiaoming出生1990-07-02'
re_str=r'生(\d{4}[年-]\d{1,2}[月-]\d{1,2}).*?'
string1=re.findall(re_str,a)
string2=re.findall(re_str,b)
print(string1)
print(string2)
#结果
['1980年5月21']
['1990-07-02']