#正则表达式
# 一:什么是正则?
# 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。
# 或者说:正则就是用来描述一类事物的规则。(在Python中)它内嵌在Python中,
# 并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。

# 二:正则的用法
import re
# print(re.findall(\'\\w9\\w\',\'axsdas9xas,_9xdsas_91\'))
#\\w,字母数字下划线,中间的必须为9
# print(re.findall(\'wangkai\',\'wangkaishige dashuaibi,wangkai111\'))
#匹配关键字
# print(re.findall(\'\\W\',\'wangkais++++=10==100\'))        
#\\W,非字母数字下划线,和\\w 相反
# print(re.findall(\'\\s\',\'   wangk  ai   aksds   \'))      
#匹配空格
# print(re.findall(\'\\S\',\'   wangk  ai   aksds   \'))     
#匹配非空格
# print(re.findall(\'\\d\',\' 232312 a432i4   a6k65sds   \'))     
#匹配数字
# print(re.findall(\'\\D\',  \'wangk 4556 ai34   aksadsds\'   ))     
#匹配非数字
# print(re.findall(\'\\n\',  \'wangk 4556 ai34 \\n  aksadsds\'   ))     
#匹配换行符
# print(re.findall(\'\\t\',  \'wangk 4556 ai34  \\t aksadsds\'   ))     
#匹配制表符
# print(re.findall(\'^wang\',  \'wang 4556 ai34  \\t aksadsds\'   ))     
#仅匹配字符串的开头
# print(re.findall(\'$wang\',  \'wang 4556 ai34  \\t aksadsds\'   ))     
#仅匹配字符串的开头
# print(re.findall(\'.\',  \'wang 4556 ai3\\n aksadsds\'   ))     
#匹配任意字符,除换行符
# print(re.findall(\'a.g\',  \'wang 4556 ai3\\n aksadsds\',re.DOTALL  ))     
#匹配a和g中含任意字符

# print(re.findall(\'a[n]g\',  \'wang 4556 ai3\\n aksadsds\',re.DOTALL  ))    
#匹配a和g中含n
# print(re.findall(\'a[1-9]g\',  \'wang 4556 ai3\\n aksaa9gdsds\',re.DOTALL  ))     
#匹配a和g中含1-9的数字
# print(re.findall(\'a[^1-9]g\',  \'wang 4556 ai3\\n aksaa9gdsds\',re.DOTALL  ))  
#匹配除了a和g中含1-9的数字
# print(re.findall(\'a[a-zA-Z]g\',  \'wang 4556 ai3\\n aksaa9gdsds\',re.DOTALL  ))       #匹配a和g中大小写字母
# print(re.findall(\'a[=+*/-]g\',  \'wang 4556 ai3\\n aksaa-gdsds\',re.DOTALL  ))
# print(re.findall(\'a[=+*\\-/]g\',  \'wang 4556 ai3\\n aksaa-gdsds\',re.DOTALL  ))
#匹配a和g中加减乘除,但是减号要放到两边,或者-号前面加上转义符\\

#重复匹配
# ?:  代表?左边的字符出现0次到一次
# print(re.findall(\'ab?\',\'a ab abb abbb a1bb abbbbbb\'))         
#只取a0个b到a1个b
#*: 代表*左边的字符出现0次到无数次
# print(re.findall(\'ab*\',\'a ab abb abbb a1bb abbbbbb\'))        
#取a0个b到a无数个b
# +:代表+左边的字符出现1次到无穷次
# print(re.findall(\'ab+\',\'a ab abb abbb a1bb abbbbbb\'))         
#取a1个b到a无数个b
#{n,m}:代表{n,m}左边的字符出现n次到m次
# print(re.findall(\'ab{1,3}\',\'a ab abb abbb a1bb abbbbbb\'))        
#取a(n个b)到a(m个b)
# print(re.findall(\'ab{1,}\',\'a ab abb abbb a1bb abbbbbb\'))    
#取a(n个b)到a(无穷个b)
# print(re.findall(\'ab{0,1}\',\'a ab abb abbb a1bb abbbbbb\'))        
#取a(0个b)到a(1个b)
# print(re.findall(\'ab{,}\',\'a ab abb abbb a1bb abbbbbb\'))         
#取a(0个b)到a(无穷个b)
#贪婪匹配       .*
# print(re.findall(\'a.*b\',\'a ab abb abbb a1bb abbbbbb\'))         
#取a到最远的b的所有值
#非贪婪匹配      .*?
# print(re.findall(\'a.*?b\',\'a ab abb abbb a1bb abbbbbb\'))         
#取a到最近的b的所有值

#|:或者
# print(re.findall(\'companies|company\',\'Too many companies have gone bankrupt,c and the next one is my company\'))
#取xx或xxx的所有值

#():分组
# print(re.findall(\'compan(ies|y)\',\'Too many companies have gone bankrupt,c and the next one is my company\'))
#compan依然是判断条件,但是只取括号里面的值,
# print(re.findall(\'compan(?:ies|y)\',\'Too many companies have gone bankrupt,c and the next one is my company\'))
#compan依然是判断条件,但是取所有参与判断的值,

#爬虫应用
# print(re.findall(\'href=\"(.*?)\"\',\'<p>动感视频</p><a href=\"https://www.douniwan.com/1.mp4\">逗你玩呢</a><a href=\"https://www.xxx.com/2.mp4\">葫芦娃</a>\'))
#取最远的值
# print(re.findall(\'href=\"(.*)\"\',\'<p>动感视频</p><a href=\"https://www.douniwan.com/1.mp4\">逗你玩呢</a><a href=\"https://www.xxx.com/2.mp4\">葫芦娃</a>\'))
#取最近的值

# print(re.findall(\'ag\',  \'wag aG Ag 4556 ai3\\n aksadsds\',re.I  ))     
#re.I,匹配大小写

# print(re.findall(\'m\\\\\\\\e\',\'m\\e\'))               
#\\的用法
# print(re.findall(r\'m\\\\q\',\'m\\q\'))                     
#打印出来的结果多一个\\,自动添加转义符
#
# msg=\"\"\"
# my name is egon
# asdfsadfadfsadf egon
# 123123123123123egon
# \"\"\"
# print(re.findall(\'egon$\',msg,re.M))     #my name is egon\\nasdfsadfadfsadf egon\\n123123123123123egon\'
#re.M,取所有行

#re模块其他方法
#res=re.findall(\'(href)=\"(.*?)\"\',\'<p>动感视频</p><a href=\"https://www.douniwan.com/1.mp4\">逗你玩呢</a><a href=\"https://www.xxx.com/2.mp4\">葫芦娃</a>\')
# print(res)


# res=re.search(\'(href)=\"(.*?)\"\',\'<p>动感视频</p><a href=\"https://www.douniwan.com/1.mp4\">逗你玩呢</a><a href=\"https://www.xxx.com/2.mp4\">葫芦娃</a>\')
# print(res)                      #search只能找第一个
# print(res.group(0))             #0代表所有
# print(res.group(1))             #1代表分组第一个,第一个括号里的内容
# print(res.group(2))           #2代表分组第2个,第二个括号里的内容


# res=re.match(\'abc\',\'123abc\') ## res=re.search(\'^abc\',\'123abc\')
# print(res)          #match代表只从开头查找,相当于findall中的(^)

# print(re.findall(\'alex\',\'alex is alex is alex\'))        #三个用法对比
# print(re.search(\'alex\',\'alex is alex is alex\'))
# print(re.match(\'alex\',\'alex is alex is alex\'))


# pattern=re.compile(\'alex\')                          #简写模式
# print(pattern.findall(\'alex is alex is alex\'))
# print(pattern.search(\'alex is alex is alex\'))
# print(pattern.match(\'alex is alex is alex\'))

# msg=\"1-2*(60+(-40.35/5)-(-40*3))\"
# [\'1\', \'2\', \'60\', \'-40.35\', \'5\', \'-40\', \'3\']       #得出这种结果
# print(re.findall(\'\\D?(-?\\d+\\.?\\d*)\',msg))
#推导过程
# print(re.findall(\'\\d*\',msg))         #取数字类型
# print(re.findall(\'-?\\d*\',msg))       #取带-号的值,加上-号,可以有,可以没有
# print(re.findall(\'-?\\.?\\d*\',msg))       #取带点的,加上-,要加转义符,不然是任意的意思
# print(re.findall(\'-?\\d+\\.?\\d*\',msg))     #再次定义数字类型,取至少一个以上的数字
# print(re.findall(\'-?\\d+\\.?\\d*\',msg))      #只取是做-号的-号,减法的去掉
# print(re.findall(\'\\D?(-?\\d+\\.?\\d*)\',msg))  #判断-号的类型,在非数字类型后面的-号就是要取的。

收藏 打印