正则表达式 与 re模块

正则表达式

规则

正则表达式就是匹配字符串内容的一种规则
[ ] 字符组,在同一个位置上能匹配的可能范围 例如:[0123] [0-3] [a-z] [a-z0-9] 两个范围也可以

字符
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或者下划线 \W 匹配非 \w 大写都是非
\s 匹配任意的空白符 \S
\d 匹配数字 \D
\n 匹配换行符
\t 匹配制表符(Tab)
^ 匹配一个字符串的开头 例如:^e 匹配开头为e的
$ 匹配结尾 例如:e$ 以e结尾的 ^与$一起使用同时约束开始和结尾
| 或 例如:a|b 匹配a或者b
() 一个分组
[…] 匹配字符组中的字符
[^…] 匹配除了字符组中的字符的所有字符

量词 (最后都可以加 ? ,表示尽可能少次匹配)
* 匹配0次或者多次 \d* 可以匹配0次或者多次数字
+ 匹配一次或者多次
? 匹配零次或者一次
{n} 匹配 n次
{n,} 匹配 >=n次
{n,m} 匹配 n到 m次

[^和]{2,3}? 匹配非和的字符2-3次,加?是非贪婪匹配,最少次数匹配
.*?x 可以取任意长度的字符串,直到出现x为止

转义符 想要匹配\d等转义符
\d 加 \ 可以取消转义
r’\d’ 加 r 也是取消转义的

re模块

#incoding=UTF-8
import re

# findall('正则表达式','待匹配字符串')     返回所有符合条件的结果放在列表中
ret = re.findall('[a-z]+','python zhen nan')
print(ret)  #['python', 'zhen', 'nan']

#search()    从前往后找,找到一个就返回,  返回的是一个对象,需要调用group才能返回结果
ret1 = re.search('n','python zhen nan')
print(ret1)         #<re.Match object; span=(5, 6), match='n'>
print(ret1.group()) # n

#通过名字来取分组
ret8 = re.search('\d(\w)','da3892fcn mfjksm')
print(ret8.group(0))    # 38
print(ret8.group(1))    # 8

ret9 = re.search('\d(?P<name>\w)','da3892fcn mfjksm')
print(ret9.group(0))    # 38
print(ret9.group('name'))    # 8
    # 这里前后都用一个分组名,表示要匹配的内容前后要一致才行
ret10 = re.search('<(?P<tag_name>\w+)>\w+</(?P=tag_name)>','<h1>hello</h1>')
print(ret10.group())            # <h1>hello</h1>
print(ret10.group('tag_name'))  # <h1>


#match()    从头开始匹配,第一个必须匹配上才可以
ret2 = re.match('n','python zhen nan')
print(ret2)         # None
#print(ret2.group()) #报错,必须匹配p 才可以

#finditer()  返回一个迭代器,所有结果都在迭代器中
ret3 = re.finditer('[a-z]+','python zhen nan')
for i in ret3:
    print(i.group())    #依次换行打印 python zhen nan

'''
    使用 ?: 在 ()中使用,取消findall()内的优先级
        ()                  split() 
'''
#findall
ret4 = re.findall('www.(baidu|oldboy).com','www.oldboy.com')
print(ret4)     # ['oldboy']  这是因为findall 会优先把组内结果返回

ret5 = re.findall('www.(?:baidu|oldboy).com','www.oldboy.com')
print(ret5)     # ['www.oldboy.com']

#split
ret6 = re.split('\d+','ave3ghdi4mvkl')
print(ret6)     # ['ave', 'ghdi', 'mvkl']

ret7 = re.split('(\d+)','ave3ghdi4mvkl')
print(ret7)     # ['ave', '3', 'ghdi', '4', 'mvkl']

'''re 的 flag值
re.I    忽略大小写
re.M    多行模式,改变^和$的行为
re.S    . 可以匹配任意字符,包括换行符
re.L    本地化识别
re.U
re.X    冗长模式,pattern字符串可以是多行的,忽略空白字符,并可以添加注释
'''




#作业:做一个计算器
#1.得到一个字符串  2.去空格  3.算小括号里面的   4.先算乘除,再算加减

ret = re.findall('\S+','1+34 *(5+6*24)-30 + 5.8/3')
print(ret)
上一篇:汉罗塔问题(c语言)


下一篇:创新实训(3)——Springboot中mongoDB服务的层次结构