正则表达式

概要图

正则表达式

正则表达式:是对字符串操作的一种逻辑公式,就是事先定义好的一些特定的字符以及这些特定字符的组合,组成一个有规则的
字符串。这个字符串用来表达字符串一种过滤的逻辑。

paterrn = 'python'
str = 'python and java'
'''re.match()
#第一个参数pattern正则表达式,第二个参数str是要匹配的字符串,第三个参数标志位 匹配方式
'''
result = re.match(paterrn, str)
if result:
    print(result.group())
    print(result.start())
    print(result.end())
    print(result.span())
else:
    print("there is nothing to match")

匹配单个字符串

(1). 匹配任意除了换行的任意1个字符
(2) []匹配[]中列举的字符
(3)\d 匹配数字0-9
(4)\D 匹配非数字
(5)\s 匹配空白 空格tab键
(6)\S 匹配非空白键
(7)\w 匹配单词字符 a-z A-Z 0-9 _
(8)\W 匹配非单词字符

def fn(ptn, lst):

    for x in lst:
        result = re.match(ptn,x)

        if result:
            print(x,"匹配成功","匹配的结果是:",result.group())
        else:
            print("没有匹配到")
 # (1). 匹配任意除了换行的任意1个字符
ptn = "ab."
lst = ["abc1",'ab','aba','wwww']

# (2) []匹配[]中列举的字符
ptn = 'm[abcd]n'
lst = ['man','mbn','mdn','nab']

#(3)\d 匹配数字0-9
ptn = 'py\d'
lst = ['py1','py2','py3','pyy']

#(4)\D 匹配非数字
ptn = 'py\D'
lst = ['py1','py2','py3','pyy']

#(5)\s 匹配空白 空格tab键
ptn = 'hello\sworld'
lst = ['hello world','helloworld','hello,world']

#(6)\S 匹配非空白键
ptn = 'hello\Sworld'
lst = ['hello world','helloworld','hello,world'] # helloworld 没有被匹配的原因是因为少了一个字符

#(7)\w 匹配单词字符 a-z A-Z 0-9 _
ptn = 'py\w'
lst = ['pya','pyA','py2','py_',"py."]

#(8)\W 匹配非单词字符
ptn = 'py\W'
lst = ['pya','pyA','py2','py_',"py."]

匹配多个字符

(1) * 匹配前一个字符出现0次或者是无限次,可有可无
(2)+ 匹配前一个字符出现一次或者是无限次,至少有1次
(3)?匹配前一个字符出现一次或者是零次,要么有一次或者没有
(4){m} 匹配前一个字符出现m次
(5){m,n} 匹配前一个字符出现m到n次
(6){m,} 匹配前一个字符出现m到无限次

# (1) * 匹配前一个字符出现0次或者是无限次,可有可无
# (2)+ 匹配前一个字符出现一次或者是无限次,至少有1次
# (3)?匹配前一个字符出现一次或者是零次次,要么有一次或者没有
ptn = 'h[a-z]*'
ptn2 = 'h[a-z]+'
ptn3 = 'h[a-z]?'
lst = ['hello','abc','xxx','h']
fn(ptn,lst)
fn(ptn2,lst)
fn(ptn3,lst)

# (4){m} 匹配前一个字符出现m次
# (5){m,n} 匹配前一个字符出现m到n次
# (6){m,} 匹配前一个字符出现m到无限次
ptn = '[\w]{5}'
ptn2 = '[\w]{4,6}'
ptn3 = '[\w]{4,}'
ptn4 = '[h]{2,}'
lst = ['hello','hhh','hxxxxxx','happyy']
fn(ptn,lst)
fn(ptn2,lst)
fn(ptn3,lst)

匹配结尾和开头

(1)^ 匹配字符串开头
(2)$ 匹配字符串结尾

#匹配数字或者字符开头的邮箱?
ptn = '[\w]+@qq.com$'
ptn2 = '^[0-9]+@qq.com'
lst = ['12@qq.com','abc@yy.com','bcde@qq.com.cn']
fn(ptn,lst)
fn(ptn2,lst)
ptn3 = '[\w]+@qq.com.cn'
lst = ['12@qq.com','abc@yy.com','bcde@qq.com.cn']
fn(ptn3,lst)

匹配数组

(1)| 匹配左右任意一个表达式
(2)(ab) 将括号中的字符作为一个分组
(3)\num 引用分组num匹配到的字符串

# (1)| 匹配左右任意一个表达式
ptn = "hello|hc"
lst = ['hello','hc','ok','hello world']

# (2)(ab) 将括号中的字符作为一个分组
# 检查一个以134 或者是135开头的手机号
ptn = '(134|135)[0-9]{8}'
lst = ['13423456789','13567899876','13234567654']

ptn = '([^-]*)-(\d+)'
lst = ['010-12345678']
# 可用result.group(1),result.group(2)打印检验

ptn = r'<([a-zA-Z]{1,12})>\w*</\1>'   # r显示原始字符串,</\1>代表与前面的分组一致
lst = ['<title>hello</title>','<body>bbb</body>','<a>python</b>']
fn(ptn,lst)

正则的其他的方法

match()方法 只能匹配开始
search()方法 可以匹配任意位置
sub()方法,可以替换字符串
split() 方法 分割字符串

ptn = 'com'
s = 'www.baidu.com'
result = re.search(ptn,s)
result = re.match(ptn,s)
#
if result:
    print('匹配成功',result.group())
else:
    print('匹配失败')

ptn = r'\d+'
s = "当前阅读次数为:100次,点赞次数有19次"
result = re.search(ptn,s) #找到第一个出现的
print(result.group())
result2 = re.findall(ptn,s) #找到符合所有正则规则的字符
print(result2)

ptn = r'\d+'
s = '阅读次数:6666'
def demo(r):
    x = int(r.group())
    y = x+1
    return str(y)
# sub()方法,将匹配到的数据进行替换
r = re.sub(ptn,demo,s)
print(r)
# split() 拆分字符串
# str.split() 不支持多个分隔符操作,
#  re.split() 正则的split方法可支持多个切割符号
s = 'name=qinghuan,age=18,email=qinghuan@qq.com'
print(s.split(','))
ptn = r'[=,@]'
r = re.split(ptn,s)
print(r)

贪婪匹配和非贪婪匹配

贪婪是一直匹配到最后,非贪婪匹配是尽可能匹配到更少的内容

s = r'<div>abc</div><div>bcd</div>'
# 需求:<div>abc</div>
ptn = r'(<div>.*?</div>)'
r = re.match(ptn,s)
print(r.group())
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值