正则表达式详细规则

python 可以通过正则表达式对字符进行匹配
需要 re 模块
例如

ret=re.match(".*","abc")
print(ret.group())
print(ret)
print(ret.string)#待匹配的文本

输出

abc
<re.Match object; span=(0, 3), match='abc'>
abc

这里列举一些正则表达式的匹配规则

匹配单个字符

字符意义
.匹配任意字符,除了(\n)
[]匹配[]中列举的字符
\d匹配数字0-9
\D匹配非数字
\s匹配空白 就是匹配空白和tab键
\S匹配非空白
\w匹配单词字符 a-z A-Z 0-9 _
\W匹配非单词的字符

匹配多个字符

字符意义
*匹配前一个字符出现0次或者多次 >=0
+匹配前一个字符出现次数 >=1
?匹配前一个字符出现1次或者没有 0 or 1
{m}匹配前一个字符出现m次
{m,n}匹配前一个字符出现m-n次

匹配分组

字符意义
|匹配左右任意一个表达式
(ab)将括号中的字符作为一个分组
\num引用分组num匹配到的字符串
(?P<name>)分组起别名
(?P=<name>)引用分组为name分组匹配到的字符串

使用re模块中的match方法之后,会返回一个match对象

Match对象的属性

属性说明
.string待匹配的文本
.re匹配时使用的patter对象(正则表达式)
.pos正则表达式搜索文本的开始位置
.endpos正则表达式搜索文本的结束位置

Match对象的方法

方法说明
.group()获得匹配后的字符串
.start()匹配字符串在原始字符串的开始位置
.end()匹配字符串在原始字符串的结束位置
.span()返回(.start(), .end())

用 ^ 和 $ 符号来代表开头和结尾

例1:

import re
ret=re.match("^1\w*","123dsafsdajf")
#表示以1为开头,后面接单词字符任意次
print(ret.group())

输出

123dsafsdajf

例2:

import re
ret=re.match("^2\w*","123dsafsdajf")
print(ret.group())

输出:(没有匹配到什么东西)

AttributeError: 'NoneType' object has no attribute 'group'

例3:

import re
ret=re.match("\w*d$","123dsafsdad")
#表示以d结尾
print(ret.group())

输出:

123dsafsdad

例4:

import re
ret=re.match("\w*?d","123dsafsdajf")
#问号表示非贪婪算法,选取尽量少的匹配
print(ret.group())

输出:

123d

匹配分组

下面这个例子利用分组从一堆字符串中筛选出我想要的片段

import re
ret=re.match("([^2]*)-(\d+)","1914-139999999999")
print(ret.group(1))
print(ret.group(2))

输出:

1914
139999999999

使用\num引用分组的方法

urlnames=["<html><h1>hhh</h1></html>","<html><h1>hhh</h2></html>"]
for ul in urlnames:
    ret=re.match(r"<(\w*)><(\w*)>.*</\2></\1>",ul)
    # \1 ,\2表示引用之前的分组
    if ret:
        print("%s是成功的"%ret.group())
    else:
        print("错误")

输出:(因为html里面的开始标签和关闭标签必须一样)

<html><h1>hhh</h1></html>是成功的
错误

给分组起别名

ret=re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>","<html><h1>hhh</h1></html>")
print(ret.group())

输出

<html><h1>hhh</h1></html>

贪婪匹配和非贪婪匹配
默认都是贪婪匹配,即尽可能匹配多的字符,贪婪变非贪婪加一个 ? 符号

import re
ret=re.match(r"aa(\d+?)","aa123123adasd")
print(ret.group(1))

输出:1
虽然1后面还是\d类型,但是不会继续匹配。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值