正则表达式

动机

  • 文本处理成为计算机常见工作之一
  • 对文本内容搜索,定位,提取是逻辑比较复杂的工作
  • 为了快速方便的解决上述问题,产生了正则表达式技术

定义

文本的高级匹配模式, 提供搜索, 替换, 本质由字符和特殊符号构成的字符串,

这个字符串即为正则表达式

匹配原理

通过普通字符和特殊含义的字符串, 来组成字符串,

用以描述一定的字符串规则, 比如重复, 位置, 来表达一种特定类型的字符串, 进而匹配

正则字符

通用

 0 - 9   匹配所有字符
a - z 匹配所有小写字母
A - Z 匹配所有大写字母
A-Za-z 匹配所有字母

字符

.       换行符以外的任意
\w 数字, 字母, 下划线, 汉字 [a-z]
\s 空格
\d 数字 [0-9]
\b 单词边界 (数字,字母,下划线,汉字 与 其他字符交界位置)
\W 非 数字, 字母, 下划线, 汉字 [^a-z]
\S 非 空格
\D 非 数字 [^0-9]
\B 非 单词边界
\n 换行符
\t 制表符
^ 开始位置
$ 结束位置
| 或 (匹配上即不在匹配,需要 长的放在前面 例如 abc|ab )

量词

*       0~n次+       1~n次
? 0~1次
{n} n次
{n,} n或 n+次
{n,m} n~m 次

字符集

[]      匹配字符组中的字符
[^] 匹配除了字符中的所有字符

分组

()      对整体进行 量词约束   ---> \1 \2 \3 进行位置选择
(?:) 取消分组优先 (?P<name>pattern) 命名分组 ----> \g<name1> \g<name2> 进行命名选择

注意点

  • 一个正则中可以存在多个分组, 且分组可以嵌套
  • 作用前提是整体的表达式能被匹配到内容才可以
  • 未命名分组和命名分组是可以同时存在的, 未命名分组按照从外到内, 从左到右按照位置来用索引来命名
  • 分组不要重叠, 且最好不要嵌套, 倘若出现说明设计存在巨大缺陷

转义

\       被转义前加反斜线表示 匹配这一字符而不是用作正则表达式来处理
r'' python 对字符串的不转义需要 用 r 来表示, 减去书写的麻烦

 实例解析

# r""
# s = "\\hello"
# print(re.findall("\\\\\\w+", s))
# print(re.findall(r'\\\w+', s)) """
python 字符串 --> 正则 --> 目标字符串
"\\$\\d+" \$\d+ "$100"
r"\$\d+" \$\d+ "$100"
* 为避免特殊字符串在字符串中使用时转义的麻烦, 使用 raw 字符串来表达正则表达式
"""

总结

匹配单个字符

. [] [^] \d \D \w \W \s \S

匹配重复

* + ? {n} {n,m}

匹配位置

^ $ \A \Z \b \B

其他

| () \

贪婪 / 非贪婪匹配

  • 默认 贪婪匹配 , 尽可能的往后匹配更多的内容
  • 加 ? 改为 非贪婪匹配, 懒惰模式, 满足条件后不往后匹配更多内容
  • 主要影响到的是重复匹配的操作符 * + ? {n} {n,m}
# 非贪婪匹配的运用
# s = "ashb, asjdlab, asdadb"
# print(re.findall(r"a.*b", s)) # ['ashb, asjdlab,asdadb']
# print(re.findall(r"a.*?b", s)) # ['ashb', 'asjdlab', 'asdadb']

匹配原则

  • 正确性     正确的匹配出目标字符串
  • 精准性     除了目标内容, 尽可能不要存在多余内容
  • 全面性     尽可能对目标字符串考虑全面, 做到不遗漏

Python re模块使用

compile

regex = compile(pattern,flags=0)

功能  生成正则表达式对象

参数

   pattern 正则表达式

  flags 功能标识,扩展正则匹配功能

返回值  正则对象

compile对象属性

  • flags : flags值
  • pattern : 正则表达式
  • groups : 子组数量
  • groupindex : 捕获组名与组序号的字典

findall

re.findall(pattern,string,flags=0)

功能  通过正则表达式匹配目标字符串内容

参数

  pattern 正则表达式

  string 目标字符串

返回值  

   返回匹配到的内容列表

    如果正则表达式存在 子组 则只返回 子组对应的内容

sub

re.sub(pattern,replace,string,max,flags=0)

功能  使用指定字符串替换正则表达式匹配内容

参数  

  pattern 正则

  replace 指定字符串

  string 目标字符串

  max 最多替换几处,默认全部替换

返回值  替换后的字符串

subn

re.subn() 

功能参数 同sub,

返回值 多一个实际替换个数

finditer

re.finditer(pattern,string,flags=0)

功能  使用正则表达式匹配目标内容

参数  

  pattern 正则

  string 目标字符串

返回值   迭代对象

fullmatch

re.fullmatch(pattern,string,flags=0)

功能  完全匹配某个目标字符串

参数  

  pattern 正则

  string 目标字符串

返回值  匹配内容match object

match

re.match(pattern,string,flags=0)

功能  匹配某个目标字符串开始位置

参数

  pattern 正则

  string 目标字符串

返回值  匹配内容match object

match 对象

属性

pos   匹配的目标字符串开始位置
endpos 匹配的目标字符串结束位置
re 正则表达式
string 目标字符串
lastgroup 最后一组的名称
lastindex 最后一组的序号

方法

span()  获取匹配内容的起止位置
start() 获取匹配内容的开始位置
end() 获取匹配内容的结束位置
groupdict() 获取捕获组字典,组名为键,对应内容为值
groups() 获取子组对应内容
group(n = 0)

功能  获取match对象匹配内容

参数  

  默认为0表示获取整个match对象内容

  如果是序列号或者组名则表示获取对应子组内容

返回值  匹配字符串

import re
import sys port = sys.argv[1] f = open('1.txt') # 找到端口所在的对应段落
while True:
data = ''
for line in f:
if line != '\n':
data += line
else:
break
if not data:
print("No PORT")
break # 通过首单词比对是否为目标段
try:
PORT = re.match(r'\S+', data).group()
except Exception:
continue
if port == PORT:
# pattern=r"[0-9a-f]{4}\.[0-9a-f]{4}\.[0-9a-f]{4}"
pattern = r"address is ((\d{1,3}\.){3}\d{1,3}/\d+|Unknown)"
address = re.search(pattern, data).group(1)
print(address)
break f.close()

找到端口所在的对应段落

search

re.search(pattern,string,flags=0)

功能  匹配目标字符串第一个符合内容

参数  

  pattern 正则

  string 目标字符串

返回值  匹配内容match object

flags

扩展丰富正则表达式的匹配功能

可调用的函数

re.compile,re.findall,re.search....

常用 flag

A == ASCII  元字符只能匹配ascii码
I == IGNORECASE 匹配忽略字母大小写
S == DOTALL 使 . 可以匹配换行
M == MULTILINE 使 ^ $可以匹配每一行的开头结尾位置
X == VERBOSE 为正则添加注释

使用多个flag

flags = re.I | re.A

实例

import  re 

# 只匹配ascii字符
# regex = re.compile(r'\w+',flags=re.A) # 忽略字母大小写
# regex = re.compile(r'[A-Z]+',flags=re.I) # . 可以匹配换行
# regex = re.compile(r'.+',flags=re.S) # 匹配每一行开始位置
# regex = re.compile(r'^北京',flags=re.M) # 为正则添加注释
pattern = r'''[A-Z][a-z]* #匹配第一个单词
\s+\w+\s+ #匹配空行和第二个单词
\w+ #匹配汉字
'''
regex = re.compile(pattern,flags=re.X) s = '''Welcome to
北京
'''
l = regex.findall(s)
print(l)

flag 实例

split

split(pattern, string, maxsplit=0, flags=0)

功能  实现对字符串的正则切割, 可以进行多个分隔符进行切割

参数  正则, 被切割字符串, 保留个数, flag

import re

s = "sda.sda'sda/sda1adsa-ada.sad"
print(re.split("[./'-]+", s))
# ['sda', 'sda', 'sda', 'sda1adsa', 'ada', 'sad']
import re

s = "sda.sda'sda/sda1adsa-ada.sad"
print(re.split("[./'-]+", s, maxsplit=3))
# ['sda', 'sda', 'sda', 'sda1adsa-ada.sad']

Python 正则处理_re模块的更多相关文章

  1. python正则以及collections模块

    正则 一.认识模块  什么是模块:一个模块就是一个包含了python定义和声明的文件,文件名就是加上.py的后缀,但其实import加载的模块分为四个通用类别 : 1.使用python编写的代码(.p ...

  2. Python正则、re模块

    正则的概念 findall        match        search  方法 元字符的用法和作用 正则表达式概念 正则表达式是对字符串操作的一种逻辑公式,就是对字符串的一种过滤 可以判断是 ...

  3. 认识python正则模块re

    python正则模块re python中re中内置匹配.搜索.替换方法见博客---python附录-re.py模块源码(含re官方文档链接) 正则的应用是处理一些字符串,phthon的博文python ...

  4. Python正则式的基本用法

    Python正则式的基本用法 1.1基本规则 1.2重复 1.2.1最小匹配与精确匹配 1.3前向界定与后向界定 1.4组的基本知识 2.re模块的基本函数 2.1使用compile加速 2.2 ma ...

  5. python 正则,常用正则表达式大全

    Nginx访问日志匹配 re.compile #re.compile 规则解释,改规则必须从前面开始匹配一个一个写到后面,前面一个修改后面全部错误.特殊标准结束为符号为空或者双引号:  改符号开始 从 ...

  6. Python正则匹配字母大小写不敏感在读xml中的应用

    需要解决的问题:要匹配字符串,字符串中字母的大小写不确定,如何匹配? 问题出现之前是使用字符串比较的方式,比如要匹配'abc',则用语句: if s == 'abc':#s为需要匹配的字符串 prin ...

  7. Python爬虫之urllib模块1

    Python爬虫之urllib模块1 本文来自网友投稿.作者PG,一个待毕业待就业二流大学生.玄魂工作室未对该文章内容做任何改变. 因为本人一直对推理悬疑比较感兴趣,所以这次爬取的网站也是平时看一些悬 ...

  8. Python之旅Day6 模块应用

    time datetime random os sys shutil pickle json shelv xml configparser hashlib subprocess logging re ...

  9. Python全栈开发之路 【第六篇】:Python基础之常用模块

    本节内容 模块分类: 好处: 标准库: help("modules") 查看所有python自带模块列表 第三方开源模块: 自定义模块: 模块调用: import module f ...

随机推荐

  1. 上海启动5G试用!104页PPT,为你深度解析5G终端的创新和机遇

    文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 来源:国泰君安证券 作者:分析师王聪.张阳.陈飞达 导读:2019年是5G元年,各大品牌将陆续推出5G ...

  2. (简单)华为荣耀9i LLD-AL20的Usb调试模式在哪里开启的方法

    每当我们使用pc通过数据线连接上安卓手机的时候,如果手机没有开启Usb开发者调试模式,pc则没法成功检测到我们的手机,有时,我们使用的一些功能较好的应用如以前我们使用的一个应用引号精灵,老版本就需要开 ...

  3. huffman树即Huffma编码的实现

    自己写的Huffman树生成与Huffman编码实现 (实现了核心功能 ,打出了每个字符的huffman编码 其他的懒得实现了,有兴趣的朋友可以自己在我的基础增加功能 ) /* 原创文章 转载请附上原 ...

  4. The account that is running SQL Server Setup does not have one or all of the following rights: the right to back up files and directories, the right to manage auditing and the security log and the rig

    安装SQL SERVER 是规则检查提示权限问题 运行secpol.msc,没有Debug program权限,添加即可,如果已加域则要在域策略修改,或退域安装后在加域.

  5. C# Math的说有函数 以及说明

    Math.Abs(x)                                      x绝对值 Math.Acos(x)                                  ...

  6. Linux 下 C# Mono P/Invoke .so 动态链接库。

    linux 的动态链接库 libgw.so 的函数 如下: struct lbt_chan { uint32_t freq_hz; uint16_t scan_time_us; }; struct l ...

  7. pymysql的使用

    import pymysql #打开数据库 (如果连接失败会报错)#db = pymysql.connect(host = '127.0.0.1', port = 3306, user = 'minb ...

  8. XML详解一XML语法

    XML指可扩展标记语言很类似 HTML,被设计用来传输和存储数据而非显示数据,XML标签没有被预定义需要自行定义标签,标签具有自我描述性,同时XML也是 W3C 的推荐标准. 先来写一个XML脚本de ...

  9. Django--用户认证组件auth(登录用-依赖session,其他用)

    一.用户认证组件auth介绍 二.auth_user表添加用户信息 三.auth使用示例 四.auth封装的认证装饰器 一.用户认证组件auth介绍 解决的问题: 之前是把is_login=True放 ...

  10. flink window的early计算

    Tumbing Windows:滚动窗口,窗口之间时间点不重叠.它是按照固定的时间,或固定的事件个数划分的,分别可以叫做滚动时间窗口和滚动事件窗口.Sliding Windows:滑动窗口,窗口之间时 ...