python与正则表达式
1.正则表达式
正则,只跟字符串相关,就是匹配字符串内容的一种规则。
正则主要有两部分组成,要查找字符的类型,以及要查找字符的数量。(自己的理解)
字符的类型:(相当于你要找的部分内容)
元字符 |
匹配内容 |
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\n | 匹配一个换行符 |
\t | 匹配一个制表符 |
\b | 匹配一个单词的结尾 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结尾 |
\W |
匹配非字母或数字或下划线 |
\D |
匹配非数字
|
\S |
匹配非空白符
|
a|b |
匹配字符a或字符b |
() |
匹配括号内的表达式,也表示一个组 |
[...] |
匹配字符组中的字符 |
[^...] |
匹配除了字符组中字符的所有字符 |
代表数量的量词:(相当于你要找的部分内容对应的个数)
量词 |
用法说明 |
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
示例:
'd\d+\w{3,6}p' 这个正则表达式代表的是:以d开头,后边是数字,数量是1个或者多个,后边是字母、数字、下划线,数量是3-6个,然后以一个p结尾。
备注:这里都是默认为贪婪模式,数量能找到满足条件的多个,就找多个,非贪婪模式的是在表达数字的后边加‘?’号。如右:'d\d+?\w{3,6}?p'
代表要查找字符位置的符号:
^ 和 $ : ^代表在字符串的开头出现,$ 代表在字符串的末尾出现。
示例
string = '海燕海东海西'
^海. 会匹配到 开头的‘海燕’ ,全部的意思是:匹配开头是海这一个字,后边跟一个除换行符之外的一个字符。
海.$ 会匹配到结尾的‘海西’ ,全部的意思是 :匹配结尾的海+一个除换行符之外的一个字符。
字符集[][^]
[ ] 表示这一个位置可能出现的字符,注意是一个位置,表示多个位置的话,可以是 [ ]*,或者 [ ]+ 等[ ]后边跟量词
[ ^ ] 表示取非,即这一个位置可能出现的字符除了括号内的,
分组 ()与 或 |
示例:
() 表示把一些字符看成一个整体, | 是或的意思。
([1-9]\d{16}[0-9x]|[1-9]\d{14}) 表示先匹配[1-9]\d{16}[0-9x]如果没有匹配上就匹配[1-9]\d{14}
2.Python 下的正则表达式—— re 模块
re模块常用方法:findall、search、 match、 split、 sub、
re.findall(pattern,)
查找满足条件的字符串,返回一个列表,元素是每一个找到的子字符串,
1 示例: 2 str = 'fhsjdhal66478636666guy66666hhfieyhf' 3 ret5 = re.findall('\d{4,6}?',str) 4 print(ret5)
结果:
[['6647', '8636', '6666']] # 此处是非贪婪模式
findall中有个分组优先的原则:
# 如果没有分组,是这样子的: str = '11512319890965443xhfauh630289768776545678ucufy' ret5 = re.findall('[0-9]\d{5}\d{8}\d{3}[0-9x]',str) # ret5 = re.findall(r'[1-9]\d{16}[0-9x]',str) print(ret5) 结果是: >>> ['11512319890965443x', '630289768776545678'] 假如我分组了,就会返回组里边的信息, str = '62012319890965443xhfauh630289768776545678ucufy' ret5 = re.findall('[0-9]\d{5}(\d{8})\d{3}[0-9x]',str) # ret5 = re.findall(r'[1-9]\d{16}[0-9x]',str) print(ret5) 结果是: >>> ['19890965', '76877654'] 其实其他位置的也匹配到了,只是没有显示出来而已。
re.resarch()
在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,通过.group()方法调用。
1 ret = re.search('a', 'eva egon yuan').group() 2 print(ret) 3 #结果 : 'a'
re.math()
在字符串开始处进行匹配,如果不在开头,则会报错,如找到,返回的跟search一样。
1 ret = re.match('a', 'abc').group() 2 print(ret) 3 4 #结果 : 'a'
re.finditer()
返回一个存放匹配结果的迭代器
1 import re 2 ret = re.finditer('\d', 'ds3sy4784a') #finditer返回一个存放匹配结果的迭代器 3 print(ret) # <callable_iterator object at 0x10195f940> 4 print(next(ret).group()) #查看第一个结果 5 print(next(ret).group()) #查看第二个结果 6 print([i.group() for i in ret]) #查看剩余的左右结果
re.split 返回一个切割之后的列表。
ret = re.split('[ab]', 'abcd')
# 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割 print(ret) # ['', '', 'cd'] 注意这里
split的优先级查询
ret=re.split("\d+","eva3egon4yuan") print(ret) #结果 : ['eva', 'egon', 'yuan'] ret=re.split("(\d+)","eva3egon4yuan") print(ret) #结果 : ['eva', '3', 'egon', '4', 'yuan'] #在匹配部分加上()之后所切出的结果是不同的, #没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项, #这个在某些需要保留匹配部分的使用过程是非常重要的。
re模块其他的方法:
sub 替换 、compile()编译成一个对象
ret = re.sub('\d', 'H', 'eva3egon4yuan4', 1) #将数字替换成'H',参数1表示只替换1个 print(ret) #evaHegon4yuan4 ret = re.subn('\d', 'H', 'eva3egon4yuan4') #将数字替换成'H',返回元组(替换的结果,替换了多少次) print(ret) obj = re.compile('\d{3}') #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字 ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串 print(ret.group()) #结果 : 123