Python正则表达式用法

目录

1. 基本知识

2.常用元字符

3. 量词

4.贪婪匹配和惰性匹配

5. findall、finditer、search、match、compile 用法

6. 给分组起别名


1. 基本知识

正则表达式(Regular Expression)是一种使用表达式对字符串进行匹配的语法规则,用于处理字符串

优点:速度快、效率高、准确性高

语法规则:使用元字符排列组合用来匹配字符串。

  • 元字符:具有固定含义的特殊符号
  • 量词: 控制前面的元字符出现的次数

2.常用元字符

常用的元字符
元字符含义
.匹配除换行符(\n、\r)之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用像"(.|\n)"的模式。
\w匹配字母或数字或下划线
\s匹配任意的空白字符
\d匹配数字
\n匹配一个换行符
\t匹配一个制表符
^匹配字符串的开始
$匹配字符串的技术
\W匹配非字母或数字或下划线
\D匹配非数字
\S匹配非空白符
a|b匹配字符a或字符b
()匹配括号内的表达式,也表示一个组
[...]匹配字符组中的字符
[^...]匹配除了字符组中字符的所有字符

3. 量词

作用:控制前面的元字符出现的次数

量词
元字符含义
*重复零次或更多次,  等价于{0, }
+重复一次或更多次,等价于{1,}
?重复零次或一次
{n}重复n次
{n,}重复n次或更多次
{n, m}重复n到m次

4.贪婪匹配和惰性匹配

表达式含义
.*贪婪匹配(尽可能多的去匹配)
.*?惰性匹配(尽可能少的去匹配)

示例

str: "玩吃鸡游戏,晚上一起上游戏,干嘛呢, 打游戏啊"
reg: 玩.*?游戏
此时匹配的是: 玩吃鸡游戏

reg: 玩.*游戏
此时匹配的是: 吃鸡游戏,晚上一起上游戏,干嘛呢, 打游戏

5. findall、finditer、search、match、compile 用法

补充: 正则表达式式中使用括号就分组匹配,一个括号就是一个分组。

(1) findall和finditer :都可以获取所有匹配的结果,不同时是findall返回的是一个list,而finditer 返回的是一个迭代器<class 'callable_iterator'>

str1 = "我今年25岁, 我有2000万"
res = re.findall("\d+", str1)
print(res) # ['25', '2000']

res = re.finditer("\d+", str1)
print(type(res))
for item in res: # 从迭代器中拿到内容
    print(item.group()) # 从匹配的结果中拿到数据
# 25
# 2000

(2)search和match

    a. search:会扫描整个字符串匹配,只会返回第一次匹配到的内容,返回的是Match object ,需要使用group拿到数据

# search用法
res = re.search("\d+", str1)
print(res) # <re.Match object; span=(3, 5), match='25'>
print(res.group()) # 25

    b.match在匹配的时候,是从字符串的开头进行匹配,类似在正则前面加上^。只有在0位置匹配成功才有返回,否则返回None

res = re.match(r"\d+", str1)
print(res) 

(3)compile 预加载,提前把正则对象加载完毕

s = """
    <div class='西游记'><span id='10086'>中国移动</span></div>
    <div class='西游记'><span id='10010'>中国联通</span></div>
"""

obj = re.compile(r"<span id='(\d+)'>(.*?)</span>")
# 直接把加载好的对象进行使用
res = obj.findall(s) 
print(res)

# [('10086', '中国移动'), ('10010', '中国联通')]

6. 给分组起别名

语法: (?P<名称>正则)

s = """
    <div class='西游记'><span id='10086'>中国移动</span></div>
    <div class='西游记'><span id='10010'>中国联通</span></div>
"""

obj = re.compile(r"<span id='(?P<id>\d+)'>(?P<name>.*?)</span>")
res = obj.finditer(s)
for item in res:
    print(item.group("id"), item.group("name"))
    
    # 10086 中国移动
    # 10010 中国联通

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值