网络编程 
首页 > 网络编程 > 浏览文章

正则表达式+Python re模块详解

(编辑:jimmy 日期: 2024/11/18 浏览:3 次 )

 正则表达式(Regluar Expressions)又称规则表达式,在代码中常简写为REs,regexes或regexp(regex patterns)。它本质上是一个小巧的、高度专用的编程语言。 通过正则表达式可以对指定的文本实现
匹配测试、内容查找、内容替换、字符串分割 等功能。

re模块介绍

Python中的re模块提供了一个正则表达式引擎接口,它允许我们将正则表达式编译成模式对象,然后通过这些模式对象执行模式匹配搜索和字符串分割、子串替换等操作。re模块为这些操作分别提供了模块级别的函数以及相关类的封装。

正则表达式一些小规则

    ①元字符

正则表达式+Python re模块详解

  ②量词

正则表达式+Python re模块详解

③贪婪和非贪婪匹配

    总是在量词范围内尽量多匹配 - 贪婪
    总是在量词范围内尽量少匹配 - 惰性
    .*"color: #ff0000">Python --> re模块

findall
        会优先显示分组内的内容
        *****取消优先显示("htmlcode">

# search 还是按照完整的正则进行匹配,显示也显示匹配到的第一个内容,但是我们可以通过给group方法传参数
# 来获取具体文组中的内容
ret = re.search('9(\d)(\d)','19740ash93010uru')
print(ret) # 变量 -- > <re.Match object; span=(1, 4), match='974'>
if ret:
  print(ret.group()) # --> 974
  print(ret.group(1)) # --> 7
  print(ret.group(2)) # --> 4

# findall
  # 取所有符合条件的,优先显示分组中的
# search 只取第一个符合条件的,没有优先显示这件事儿
  # 得到的结果是一个变量
    # 变量.group() 的结果 完全和 变量.group(0)的结果一致
    # 变量.group(n) 的形式来指定获取第n个分组中匹配到的内容

# 加上括号 是为了对真正需要的内容进行提取
ret = re.findall('<\w+>(\w+)</\w+>','<h1>askh930s02391j192agsj</h1>')
print(ret) # --> ['askh930s02391j192agsj']

    其他的内容在代码中有详细的注释,大家可以复制我的代码一步一步运行然后实验

    以下的内容有:split sub subn math,compile,finditer

# split sub subn math,compile,finditer
# split
res = re.split('\d+', "cyx123456cyxx")
print(res) # --> ['cyx', 'cyxx']
res = re.split('(\d+)', "cyx123456cyxx") # 保留分组
print(res) # --> ['cyx', '123456', 'cyxx']
# sub 替换
res = re.sub('\d+', '我把数字替换了',
       "cyx123456cyxxx123456") # 默认全部替换,当然也可以替换一次re.sub('\d+','我把数字替换了',"cyx123456cyxxx123456",1)
print(res) # --> cyx我把数字替换了cyxxx我把数字替换了
# subn 替换了并显示替换的次数
res = re.subn('\d+', '我把数字替换了', "cyx123456cyxxx123456")
print(res) # --> ('cyx我把数字替换了cyxxx我把数字替换了', 2)
# match 这个就相当与加了个^ (和search差不多) --> 主要用来规定这个字符号必须是什么样的
res = re.match('\d+', 'cyx123456cyxxx')
print(res) # --> None
res = re.match('\d+', '123cyx456cyxxx')
print(res.group()) # --> 123
# compile -- 节省代码的时间的工具
# 假如同一个正则表达式要被使用多次
# 节省了多次解析同一个正则表达式的时间
ret = re.compile("\d+")
res = ret.search("cyx12456cyxXX123")
print(res.group()) # --> 12456
# finditer --> 节省空间
ret = re.finditer("\d+", "cyx123456cyxxx125644")
for r in ret:
  print(r.group()) # --> 123456
  # 125644
# 怎么又节省时间又节省空间呢?
ret = re.compile('\d+')
res = ret.finditer("cyx222231fddsf45746sdf2123sdf56456sdf10123sdf123132sdf")
for r in res:
  print(r.group())
"""
222231
45746
2123
56456
10123
123132
"""
# 分组命名("htmlcode">
ret = filter(lambda n: n, lis)
print(list(ret)) # --> ['z', 'c', 'asd', 'sdf', 'asd']

总结

上一篇:js正则匹配table,img及去除各种标签问题
下一篇:解析正则表达式中的.*,.*?,.+?的含义