python学习笔记 day19 正则表达式(三)

匹配标签:

import re
ret=re.search('<(?P<tag_name>\w+)>\w+</(?P=tag_name)>','<h1>hello</h1>')    #后面的待匹配字符写成<h1>hello</h2>都匹配不了,因为后面的</(?P=tag_name)>已经设置为跟前面的标签名一样啦
print(ret.group())
print(ret.group('tag_name'))  #因为刚才在<(?P<tag_name>\w+)> 已经给<h1>这个标签命名为tag_name了 并且使用()把这个标签进行分组了,所以可以使用group('name')的形式取出该分组中的内容
print(ret.group(1))   #因为前面的标签已经使用(?P<tag_name>\w+)进行分组了 ,所以可以使用ret.group(1)取出第一个分组中的内容

运行结果:

 

其实我现在就是目标是后面待匹配的字符串,练习一下前面怎么写正则规则;

可以在分组中使用?<name>的形式给分组起名字;

获取的结果可以直接使用group('对应的名字')取出分组中的内容;

 

然后还可以使用另一种方法:

import re
ret=re.search(r'<(\w+)>\w+</\1>','<h1>hello</h1>')
print(ret.group())
print(ret.group(1))

我们如果不给组起名字,也可以使用\序号来找到对应的组,表示要找的内容和前面的组内容一致;

读取的匹配结果可以直接使用group(序号)拿到相应的值

运行结果:

 

匹配整数

import re
ret=re.findall('-?\d+\.\d+|(-?\d+)','-23*34.25+78-23.12+23-89')
ret.remove('')  #之所以有空格是因为 findall()中正则规则中如果有分组会优先显示,但是小数部分在匹配|后面的整数时是匹配不上的,就会返回一个‘’
ret.remove('')
print(ret)

这里用到了findall()在匹配字符串时,如果前面的正则规则是包含分组,则会优先匹配分组中的内容,之所以还会写前面那个匹配小数的就是因为如果只写或|或后面的 那么结果就会包含小数的整数部分,这显然是不合理的~

运行结果:

数字匹配

0. 比如需要匹配一个表达式中的所有数字:

import re
ret=re.findall(r'-?\d+\.\d+|-?\d+','1-2*(60+(-40.35/5)-(-4*3))')
print(ret)

 

运行结果:

 

因为这里需要匹配所有的数字,包括整数和小数,所以中间需要使用| 但是|有一个特点,前面匹配好了后面就不再继续匹配了,所以需要把长的放前面,也就是匹配小数的那部分

注意:\. 是匹配小数点,而且这里还不能加分组,因为findall()会优先匹配分组中的内容,当然我们也可以在分组前面加上?:取消分组优先

import re
ret=re.findall(r'(?:-?\d+\.\d+)|-?\d+','1-2*(60+(-40.35/5)-(-4*3))')
print(ret)

运行结果:

 

1. 匹配一段文本中每行的邮箱: http://blog.csdn.net/make164492212/article/details/51656638

import re
ret=re.search(r'\w+://\w+\.\w+\.\w+/\w+/\w+/\w+/\w+','http://blog.csdn.net/make164492212/article/details/51656638')
print(ret.group())

运行结果:

 

 2. 匹配一行文本中每行的时间字符串,比如:1990-07-15(有一点问题有待解决,,,,)

import re
ret=re.search('[1-2]\d{3}-[0]\d-[0-2]\d|([30,31])','1990-07-15')
print(ret.group())

其实这个写的有问题,就是中间的月份我不知道怎么分开匹配,用|或的话后面的时间就匹配不上啦,,,

运行结果:

 

 3. 匹配QQ号(从10000开始)

import re
ret=re.search('[1-9][]0-9]{4,}','2398409012023')
print(ret.group())

运行结果:

4. 匹配浮点数

import re
ret=re.search('\d+\.\d+','45.56')
print(ret.group())

运行结果:

 

5. Eva-J博客上的爬虫我没看太懂,,,,

 

6.作业题---实现一个计算器(使用正则表达式)

实现能计算类似 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式的计算器程序

 待完善。。。

 

posted @ 2018-09-11 21:34  写的BUG代码少  阅读(176)  评论(0编辑  收藏  举报