一、元字符

字符组是元字符中的一个。在字符组中所有的字符都可以匹配任意一个字符位置上能出现的内容,如果在字符串中有任意一个字符是字符组中的内容,那么就是匹配上的项。

[0-9]   [a-z]    [A-Z] ascii编码小的值,指向一个大的值

# \d表示匹配一个数字  [0-9]

元字符:

\w word匹配字母和数字、下划线 \d digit    \s space \n next \t tab \W \D \S
^开始 $结尾 \b   匹配边界
[] [^]   字符组相关的 
 |      或
() 分组
. 匹配除了换行符之外的任意字符
二、量词
?0次或1次,+1次或多次 *0次或多次 {n}n次 {n,}n次或多次 {n,m}n次或m次
\d+整数
\d+\.\d+  小数
\d+\.\d+|\d+ 整数或者小数  \d+(\.\d+)?
# 贪婪匹配  : 正则会尽量多的帮我们匹配
# 默认贪婪 回溯算法
# 非贪婪匹配 :会尽量少为我们匹配
# 量词?表示非贪婪 惰性匹配
# .*?x 表示匹配任意长度任意字符遇到一个x就立即停止
 元字符注意事项:

 元字符 量词
元字符 量词 ? 在量词的范围内尽量少的匹配这个元字符
分组 对某些固定的内容做量词约束
或 把长的放前面
 转义符
pattern = r'\\n'
s = r'\n'
 转义:使用 \或r转义

三、re模块

3.1  findall

import re
# findall
ret = re.findall('\d+','SGY93SHD2183Y0')
print(ret)
结果:
['', '', '']
 参数 正则表达式 待匹配的字符串
返回值 是一个列表 所有匹配到的项
没有匹配到会返回一个空列表
如果遇到分组,findall会优先显示分组中的内容
(?:正则表达式)取消分组优先

3.2  search

import re
# search
ret = re.search('\d+','SGY93SHD2183Y0')
print(ret)
print(ret.group())
结果:
<_sre.SRE_Match object; span=(3, 5), match=''> # 对象
93
返回值 : 返回一个SRE_Match对象 ,没有匹配到会返回None,没有.group()方法。如果有分组,通过索引取各分组中的内容
通过group去取值
且只包含第一个匹配到的值
      
findall 有个特点,会优先显示分组中的内容。优先前面的
import re
ret = re.findall('(www)\.(baidu|oldboy)\.(com)','www.baidu.com')
print(ret) # [('www', 'baidu', 'com')]

search的特点:

import re
ret = re.search('(www)\.(baidu|oldboy)\.(com)', 'www.baidu.com')
print(ret.group(0)) # www.baidu.com
print(ret.group(1)) # www
print(ret.group(2)) # baidu
print(ret.group(3)) # com

match  验证用户输入的内容

ret = re.match('\d+','25ahs293djjk293sahf2938u')
print(ret)      # <_sre.SRE_Match object; span=(0, 2), match='25'>
print(ret.group())    # 25

查看字符串开始位置的数字是多少,索引分别是多少。

分割split的用法

import re
s = 'alex8123egon1120boss_jin'
ret = re.split('\d+',s)
print(ret) # ['alex', 'egon', 'boss_jin'] ret = re.split('(\d+)',s) # (\d)+ \d\d\d\d\d...(\d)
print(ret) # ['alex', '8123', 'egon', '1120', 'boss_jin'] ret = re.split('\d(\d)',s)
print(ret) # ['alex', '1', '', '3', 'egon', '1', '', '0', 'boss_jin']
替换sub
s = 'alex|egon|boss|jin'
print(s.replace('|','')) # alexegonbossjin s1 = 'alex8123egon1120boss_jin626356'
ret = re.sub('\d+','|',s1)
print(ret) # alex|egon|boss_jin| ret = re.sub('\d+','|',s1,1)
print(ret)
#alex|egon1120boss_jin626356 替换一次 ret = re.subn('\d+','|',s1)
print(ret) # ('alex|egon|boss_jin|', 3) 元组,并显示次数

compile 编译正则规则

import re
com = re.compile('\d+') # 制定正则规则
ret = com.search('abc1cde2fgh3skhfk')
print(ret.group()) # ret = com.findall('abc1cde2fgh3skhfk')
print(ret) # ['1', '2', '3'] ret = com.finditer('abc1cde2fgh3skhfk')
for i in ret:
print(i.group()) # 1 2 3

finditer 节省空间的方法

ret = re.finditer('\d+','abc1cde2fgh3skhfk')
print(ret)
for i in ret:
print(i.group()) # 逐个取值

四、分组命名、分组约束

当我们需要取  <h1>函数</h1> \<a>函数</a> 中的内容时,需要用到分组命名:

pattern = '<(?P<tag>.*?)>.*?</(?P=tag)>'
ret = re.search(pattern,'<h1>函数</h1>')
print(ret) # <_sre.SRE_Match object; span=(0, 11), match='<h1>函数</h1>'>
if ret:
print(ret.group()) # <h1>函数</h1>
print(ret.group(1))  # h1
print(ret.group('tag')) # h1

可以去除类似       <h1>函数</h1>   标签对

直接用\1也是可以的

pattern = r'<(.*?)>.*?</\1>'
ret = re.search(pattern,'<a>函数</a>')
print(ret) # <_sre.SRE_Match object; span=(0, 11), match='<h1>函数</h1>'>
if ret:
print(ret.group()) # <h1>函数</h1>
print(ret.group(1)) # h1
												

最新文章

  1. C#进阶系列——动态Lamada(二:优化)
  2. ElasticSearch 入门笔记1
  3. idea 新建web项目
  4. 基础知识《七》---Java多线程详解
  5. js 获取 通过 ”?“ 或者 ”&amp;“ url 传过来参数值
  6. [.NET] 使用C#开发SQL Function来提供服务 - 简讯发送
  7. 集合类学习之HashMap
  8. json 说明书
  9. Eclipse中输入系统变量和运行参数--转
  10. linux下文件编码的查看与转换(转)
  11. ios 面试题 经典(比较全) 根据重点总结
  12. 《算法4》1.5 - Union-Find 算法解决动态连通性问题,Python实现
  13. Cocos动作执行时,同时执行完毕再进行下一步的方式
  14. 从零搭建 ES 搜索服务(四)拼音搜索
  15. 页面仔初窥&quot;前端工程化&quot;
  16. 如何轻松干掉svd(矩阵奇异值分解),用代码说话
  17. JQuery UI之Autocomplete(4)多值输入、远程缓存与组合框
  18. 下载安装mysql的一些坑
  19. winform只允许一个应用程序运行
  20. 彻底去除Win10“快速访问”

热门文章

  1. EventBus的使用;消息传递之EventBus;
  2. CF603EPastoral Oddities
  3. pytho 单例模式
  4. es6(10)--Set,Map(2)
  5. ubantu 与Windows 资源共享
  6. shell中的时间值提取(date)
  7. Android 自定义TabHost,TabWidget样式
  8. uva-565-枚举
  9. Call to undefined function think\finfo_open() 报错 解决方法
  10. python学习笔记_week22