Spider--补充--Re模块_2
# @ Author : Collin_PXY
# Python 正则表达式的应用(二)
# 正则表达式之所以让人头疼,很大程度是因为表达式里有大量的符号及它们的组合,还有很多匹配模式,想要记住比较困难。
# 总结一下,方便用到的时候查询。
# 1--特殊字符表:
# \d 0~9 的整数字元
# \D 排除0~9的整数字元的其他字符
# \s 空白、定位、Tab键、换行、换页字符
# \S 除了 空白、定位、Tab键、换行、换页字符 之外的字符
# \w 数字、大小写字母和底线_字符,即:[A-Za-z0-9_]
# \W 除了数字、大小写字母和底线_字符,即:[^A-Za-z0-9_]
# 速记:小写: d--数字 s--功能字符 w--数字、大小写字母和 _
# 大写:与小写对应的互斥的集合。
# 2--在上面的字符后面添加+后表示不限长度(至少1次),添加*后表示不限长度(至少0次)
# 比如:
# \d+ 表示不限长度的数字(至少1次)
# \w+ 表示不限长度的数字、大小写字母和底线_字符(至少1次)
# \w* 表示不限长度的数字、大小写字母和底线_字符(至少0次)
# \w? 表示数字、大小写字母和底线_字符 可有可无 (至多1次)
# '.' 单字符通配符,'.*' 任意数量字符通配符(遇到换行符就结束了,Python的 re 模块提供参数 re.DOTALL来继续查找)
# '?'(至多一次),'*'(至少0次),'+' (至少1次)数量修饰符
# '^',$" 位置修饰符(eg, pattern = '^John',pattern = 'John$');[^]排除修饰符,表示不在。
# 示例:
import re
# 测试 1--将字符串从句子分离
msg = 'John, Johnson, Johnnason and Johnnathan will attend my party tonight.'
pattern = '\w+' # 不限长度的单字
txt = re.findall(pattern,msg) # 传回搜寻结果
print(txt)
# ['John', 'Johnson', 'Johnnason', 'and', 'Johnnathan', 'will', 'attend', 'my','party', 'tonight']
# 因为","和空格 不属于\w所以,就以它们为分界了。
# 测试 2--将John开始的字符串分离
msg = 'John, Johnson, Johnnason and Johnnathan will attend my party tonight.'
pattern = 'John\w*' # John开头的单字
txt = re.findall(pattern,msg) # 传回搜寻结果
print(txt)
# ['John', 'Johnson', 'Johnnason', 'Johnnathan'] 因为","不属于\w所以,就以逗号为分界了。
# 测试 3--将John及John再加一位的的字符串分离
msg = 'John, Johnson, Johnnason and Johnnathan will attend my party tonight.'
pattern = 'John\w?' # John开头的单字
txt = re.findall(pattern,msg) # 传回搜寻结果
print(txt)
# ['John', 'Johns', 'Johnn', 'Johnn']
# 3--字符分类[]
# [a-z] 表示a-z的小写字符
# [A-Z] 表示A-Z的小写字符
# [aeiouAEIOU] 元音字符
# [2-6] 代表2~6的数字
# 4--字符分类[^]
# [^a-d] 表示不在a-d的小写字符的字符
# [^A-D] 表示不在A-Z的小写字符的字符
# [^aeiouAEIOU] 表示不是元音字符的字符
# [^2-6] 代表不是2~6范围的数字
# 5--正则表示法的 ^ 符号
# 表示目标字符串必须在要搜索的字符串的起始位置,否则为对于 search是 None,对于 findall()是空列表[].
import re
# 测试 1--搜寻John字符串在最前面
msg = 'John will attend my party tonight.'
pattern = '^John'
txt = re.search(pattern,msg)
print(txt.group()) # John
txt = re.findall(pattern,msg)
print(txt) # ['John']
# 测试 2--搜寻John字符串不是在最前面
import re
# 测试 1:
msg = 'My best friend is John'
pattern = '^John'
txt = re.search(pattern,msg)
print(txt) # None 注意当search()返回None时,不能使用group()方法了,否则报错, 可加个判断 if txt != None:。
txt = re.findall(pattern,msg) # []
print(txt)
# 测试 3--搜寻数字是不是在最前面
msg = '21 John will attend my party 28 tonight.'
pattern = '^[0-9]'
txt = re.findall(pattern,msg) # 传回搜寻结果
print(txt) # ['2']
# 测试 4--搜寻数字是不是在最前面
msg = '21 John will attend my party 28 tonight.'
pattern = '^\d'
txt = re.findall(pattern,msg) # 传回搜寻结果
print(txt) # ['2']
# 6--正则表示法的 $ 字符
# 与 ^相反,正则表示法(包括分类字符的外面)的末端放置$字符时,表示正则表示法的字符串必须出现在被搜索的字符串的最后位置。
import re
# 测试 1--搜寻最后字符是非英文字母数字和底线字符
msg = 'My best friend is John'
pattern = 'John$'
txt = re.search(pattern,msg) # 传回搜寻结果
if txt != None:
print(txt.group()) # John
txt = re.findall(pattern,msg)
print(txt) # ['John']
# 测试 2--搜寻最后字符是非英文字母数字和底线字符
msg = 'John will attend my party 28 tonight.'
pattern = '\W$'
txt = re.findall(pattern,msg) # 传回搜寻结果
print(txt) # ['.']
# 测试 3--搜寻最后字符是非英文字母数字和底线字符
msg = 'I am 28'
pattern = '\W$'
txt = re.findall(pattern,msg) # 传回搜寻结果
print(txt) # []
# 测试 4--搜寻最后字符是数字
msg = 'I am 28'
pattern = '\d$'
txt = re.findall(pattern,msg) # 传回搜寻结果
print(txt) # ['8']
# 测试 5--搜寻最后字符是数字
msg = 'I am 28 year old.'
pattern = '\d$'
txt = re.findall(pattern,msg) # 传回搜寻结果
print(txt) #[]
# 测试 6--搜寻最后字符是数字
msg = 'I am 28 year old.'
pattern = '[0-9]$'
txt = re.findall(pattern,msg) # 传回搜寻结果
print(txt) #[]
# 测试 7--搜寻最后字符是数字
msg = 'I am 28 year old 30'
pattern = '[0-9]$'
txt = re.findall(pattern,msg) # 传回搜寻结果
print(txt) #['0']
# 8--通配符 "." 匹配任意单一字符
import re
msg = 'cat hat sat at matter flat'
pattern = '.at'
txt = re.search(pattern,msg) # search()
if txt != None:
print(txt.group()) # cat
txt = re.findall(pattern,msg) # findall()
print(txt) # ['cat', 'hat', 'sat', ' at', 'mat', 'lat']
# 如果我们就是要搜寻".",而不把它当成通配符时,需要使用转义字符处理一下 '\.'
import re
msg = 'cat hat s.at at m.atter flat'
pattern = '.at'
txt = re.search(pattern,msg) # search()
if txt != None:
print(txt.group()) # .at
txt = re.findall(pattern,msg) # findall()
print(txt) # ['.at', '.at']
# 9--通配符 ".*" 匹配任意数量的任意字符(换行符除外,遇到换行符就停止搜索)
# 示例 1:
import re
msg = 'cat hat sat at matter flat'
pattern = 'h.* at'
txt = re.search(pattern,msg) # search()
if txt != None:
print(txt.group()) # hat sat at
# 示例 2:
import re
msg = 'Name: Jiin-Kwei Hung Address: 8F, Nan-Jing E. Rd, Taipei'
pattern = 'Name: (.*) Address: (.*)'
txt = re.search(pattern,msg) # 传回搜寻结果
Name, Address = txt.groups() # groups()多重指定
print("Name: ", Name)
print("Address: ", Address)
# 如果我们就是要搜寻".*",而不把它当成通配符时,需要使用转义字符处理一下 '.\*'
# 综合示例:
# excel里有一列储存了用户的 qq邮箱账号,而我们想要得到的是 qq号放在一个新的列中,我们可以使用 pandas和正则表达式:
# step 1:读取 excel 获取列数据 (这里省略,这里使用pandas 手动建立一个 存有邮箱账号的 DataFrame):
import pandas as pd
from pandas import DataFrame
df=DataFrame({
'email':['1234567@qq.com','2234567@qq.com','3234567@qq.com','4234567@qq.com']
})
df['qq']=df['email'].str.findall(pat='(.*?)@').str.get(0) # 字符串类本身就有 findall()方法,不需要使用 re库。
df
# step 2: 将 df存储在 excel文件中。(略)
# 10--换行字符的处理
# 使用'.*'搜索时遇到换行符就结束了,Python的 re 模块提供参数 re.DOTALL,功能是包括搜索换行字符,可以将此参数放在
# compile(),search(),findall()里。
示例:
import re
#测试1搜寻除了换行字符以外字符
msg = 'Name: Jiin-Kwei Hung \nAddress: 8F'
pattern = '.*'
txt = re.search(pattern,msg) # 传回搜寻不含换行字符结果
print(txt.group()) # Name: Jiin-Kwei Hung
#测试2搜寻包括换行字符
msg = 'Name: Jiin-Kwei Hung \nAddress: 8F'
pattern = '.*'
txt = re.search(pattern,msg,re.DOTALL) # 传回搜寻含换行字符结果
print(txt.group())
"""
Name: Jiin-Kwei Hung
Address: 8F
"""
# 11--再来看 MatchObject对象:
# 11-1)--解读 MatchObject对象:
# <re.Match object; span=(0, 4), match='John'>
# span=(0,4)表示起始索引位置是0,结束索引位置是4
# 11-2)--获取 MatchObject对象 : re.match()和re.search()方法
# re.match()和re.search()都可以生成MatchObject对象。
# re.match()只搜寻字符串开始的字符,若匹配则传回MatchObject对象,若失败则传回None.
# 11-3)--MatchObject对象的几个重要方法:
# MatchObject.group() 传回搜寻到的字符串
# MatchObject.start() 传回搜寻到的字符串的起始位置
# MatchObject.end() 传回搜寻到的字符串的结束位置
# MatchObject.span() 传回搜寻到的字符串的(起始,结束)位置元组
# 12--re.sub(pattern,newstr,msg)方法
# 用于搜寻并替代给定字符串里的目标字符串,但并不会改变原来的字符串,会返回一个替代过的新的字符串。(因为字符串是不可变的)
# 成功时,返回新的字符串,失败时将旧的字符串返回给变量:
# 示例 1 re.sub()的一般应用--取代匹配成功的所有字符串中的指定内容:
import re
#测试1取代使用re.sub()结果成功
msg = 'Eli Nan will attend my party tonight. My best friend is Eli Nan'
pattern = 'Eli Nan'
newstr = 'Kevin Thomson' # 新字符串
txt = re.sub(pattern,newstr,msg)
if txt != msg: # 如果txt与msg内容不同表示取代成功
print("取代成功: ", txt)
else:
print("取代失败: ", txt)
# 示例2 re.sub()的进阶应用--取取代匹配成功的所有字符串中的 指定分组内的内容:
# 测试 1:pattern里用(),newstr里用数字。
import re
# 使用隐藏文字执行取代
msg = 'CIA Mark told CIA Linda that secret USB had given to CIA Peter.'
pattern01 = r'CIA (\w)\w*' # 欲搜寻CIA + 空一格后的名字 遇到符号就停止了
newstr = r'\1***' # 新字符串使用隐藏文字替换 pattern里的字符串
txt = re.sub(pattern01,newstr,msg) # 执行取代
print("取代成功: ", txt) # 列出取代结果
# \1表示只替代 pattern01 = r'CIA (\w)\w*' 里第一个分组的内容
# M*** told L*** that secret USB had given to P***.
# 测试 2:
import re
# 使用隐藏文字执行取代
msg = 'CIA Mark told CIA Linda that secret USB had given to CIA Peter.'
pattern02 = r'CIA (\w)(\w)\w*' # 欲搜寻CIA + 空一格后的名字 遇到符号就停止了
newstr = r'\2***' # 新字符串使用隐藏文字替换pattern里的字符串
txt = re.sub(pattern02,newstr,msg) # 执行取代
print("取代成功: ", txt) # 列出取代结果
# \2表示只替代 pattern02 = r'CIA (\w)(\w)\w*' 里第二个分组的内容
# a*** told i*** that secret USB had given to e***.
参考资料: 《Python 王者归来》洪锦魁
Spider--补充--Re模块_2的更多相关文章
- Java 200+ 面试题补充③ Dubbo 模块
昨天在我的 Java 面试粉丝群里,有一个只有一年开发经验的小伙伴只用了三天时间,就找到了一个年薪 20 万的工作,真是替他感到开心. 他的经历告诉我们:除了加强自我实战经验之外,还要努力积累自己的理 ...
- Java 200+ 面试题补充② Netty 模块
让我们每天都能看到自己的进步.老王带你打造最全的 Java 面试清单,认真把一件事做到最好. 本文是前文<Java 最常见的 200+ 面试题>的第二个补充模块,第一模块为:<Jav ...
- Java 200+ 面试题补充 ThreadLocal 模块
让我们每天都有进步,老王带你打造最全的 Java 面试清单,认真把一件事做到极致. 本文是前文<Java 最常见的 200+ 面试题>的第一个补充模块. 1.ThreadLocal 是什么 ...
- Py修行路 内置模块补充 datetime模块
Python提供了多个内置模块用于操作日期时间,像calendar,time,datetime.datetime模块用于是date和time模块的合集,他内部重新封装了time模块,相比于time ...
- re模块补充 configparse模块
import rere.findall("(?:abc)+","abcabcabc")--->['abcabcabc'] import configpar ...
- sys,os,模块-正则表达式
# *__conding:utf-8__* """"我是注释""" sys,os模块 import sysimport os pr ...
- python 常用模块(一): random , time , sys , os模块部分知识.
1.常用模块:(1)collectiaons模块 (2)与时间相关 time模块 (3)random模块 (4)os模块 (5)sys模块 (6) 序列化模块: json , pickle 2 ...
- Day04——Python模块
一.模块简介 模块是实现了某个功能的代码集合,比如几个.py文件可以组成代码集合即模块.其中常见的模块有os模块(系统相关),file模块(文件操作相关) 模块主要分三类: 自定义模块 :所谓自定义模 ...
- python包-logging-hashlib-openpyxl模块-深浅拷贝-04
包 包: # 包是一系列模块文件的结合体,表现形式是文件夹,该文件夹内部通常会包含一个__init__.py文件,本质上还是一个模块 包呢,就是前两篇博客中提到的,模块的四种表现形式中的第三种 # 把 ...
随机推荐
- Oracle 数据库导入数据和编码问题
配置 control 文件: load data characterset utf8 append into table role_res_gold fields terminated by ';' ...
- RHSA-2017:3075-重要: wget 安全更新(代码执行)
[root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ...
- 下载 node.js 步骤 bower npm 报错解决
1,下载node.js ,安装之后就可以 了 2,解决"npm不是内部或外部命令" ,打开安装的node.js 的文件夹 将这个地址,放在环境变量里面 <1,属性环境 ...
- k8s集群调度方案
Scheduler是k8s集群的调度器,主要的任务是把定义好的pod分配到集群节点上 有以下特征: 1 公平 保证每一个节点都能被合理分配资源或者能被分配资源 2 资源高效利用 集群所有资 ...
- kali linux 换国内源
输入命令 vim /etc/apt/sources.list 添加国内源 #中科大deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-f ...
- composer 阿里云加速 转
阿里云 Composer 全量镜像 本镜像与 Packagist 官方实时同步,推荐使用最新的 Composer 版本. 最新版本: 1.10.8 下载地址: https://mirrors.aliy ...
- go 继承
package main import "fmt" type Animal struct { Color string } // 继承动物结构体 type Dog struct { ...
- PHP SPL标准库-数据结构
SPL是用于解决典型问题的一组接口与类的集合. 双向链表 SplDoublyLinkedList SplStack SplQueue 双链表是一种重要的线性存储结构,对于双链表中的每个节点,不仅仅存储 ...
- 一个例子"入坑"布谷鸟算法(附完整py代码)
布谷鸟是比较新的启发式最优化算法,但其与传统的遗传算法,退火算法等相比,被证明收敛速度更快,计算效率更高! 文章目录 本文诞生的缘由 布谷鸟算法思想简介 更新位置的方式 莱维飞行 局部随机行走 抛出个 ...
- tomcat 登录主页成功 点击Manager App 401 等问题
1.将项目部署在tomcat的安装路径webapps下(如果报404,查下该应用是否在tomcat的webapps下部署着) 2.启动tomcat成功,http://127.0.0.1:8080成功, ...