博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python_基础_(正表达式)
阅读量:6946 次
发布时间:2019-06-27

本文共 5141 字,大约阅读时间需要 17 分钟。

一,正则表达式

 普通的匹配都为完全匹配

正则表达式为模糊匹配

## 元字符

 

  . ^ $ * + ? {} [] () \

 

### .:一个点代表匹配一个字符>>> re.findall("he..o","abchelloabc")['hello']>>>

### ^:在字符串的开头进行匹配,>>> re.findall("^hello","ahello")[]>>> re.findall("^hello","helloabc")['hello']>>>

### $:以什么进行结尾>>> re.findall("hello$","abchello")['hello']>>>

### *:按着挨着的字符进行重复(0~无穷)>>> re.findall("o*","helloworldoooooaooo")['', '', '', '', 'o', '', 'o', '', '', '', 'ooooo', '', 'ooo', '']>>>

### +:按着挨着的字符进行重复(1~无穷) 至少有一个,贪婪匹配>>> re.findall("o+","helloworldoooooaooo")['o', 'o', 'ooooo', 'ooo']>>>>>> re.findall("hello+","helloworldoooooaooo")['hello']>>>

### ?:按着挨着的字符进行重复(1~0)    ,最多为1个>>> re.findall("o?","helloworldoooooaooo")['', '', '', '', 'o', '', 'o', '', '', '', 'o', 'o', 'o', 'o', 'o', '', 'o', 'o', 'o', '']>>>>>> re.findall("hello?","helloworldoooooaooo")['hello']>>>

{}:可以表示前面三种的情况    {0,} == *    {
1,} == + {0,1} == ? {
6}表示可以重复6次 {
1,6}表示可以重复1~6中任意的次数

### 将贪婪匹配变成惰性匹配,### 在原本*号的后面加上一个?,将贪婪匹配变成惰性匹配>>> re.findall("hello*?","abchelloabc")['hell']>>>>>> re.findall("hello+?","abchelloabc")['hello']>>>

# 元字符集[]>>> re.findall("x[yz]","xyssssssxzjxpjjjj")['xy', 'xz']>>> >>> re.findall("x[yzp]","xyssssssxzjxpjjjj")['xy', 'xz', 'xp']>>>

注:元字符集中的符号大多数为普通符号 如 *  + ?### 元字符集中有特殊意义的为 - ^ \### 一个星只匹配一个符号>>> re.findall("g[e*x]","fefefalgeeexxxx")['ge']>>>

### []与-#[a-z]匹配a~z中的一个元素>>> re.findall("g[a-z]","feaafgua")['gu']>>>>>> re.findall("g[a-z]*","feaafgua")['gua']>>>

### [0-9]匹配0~9>>> re.findall("g[0-9]*","abcg123")['g123']>>>

### []与^与-### 注:^表示的是非的意思### 匹配非0~9的字符>>> re.findall("g[^0-9]","feaafgua")['gu']>>>

### 匹配非a~z的字符>>> re.findall("g[^a-z]*","feaafg4415ua")['g4415']>>> re.findall("g[^a-z]*","feaafg44s15ua")['g44']>>>

### 元字符转义字符 \### \d 匹配任何的十进制数>>> re.findall("\d","12+(23+34)")['1', '2', '2', '3', '3', '4']>>> re.findall("\d+","12+(23+34)")['12', '23', '34']>>>

### \D 匹配任何非数字字符>>> re.findall("\D","12+(23+34)")['+', '(', '+', ')']>>>

### \s 匹配任何空白字符>>> re.findall("\s","hello world")[' ']>>>

### \S 匹配任何非空白字符>>> re.findall("\S","hello world")['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd']>>> re.findall("\S+","hello world")['hello', 'world']>>>

### \w 匹配任何字母,数字字符    相当于a-z  A-Z  0-9>>> re.findall("\w","hello world111")['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd', '1', '1', '1']>>> re.findall("\w+","hello world111")['hello', 'world111']>>>>>> re.findall("\w+","hello world111_+")['hello', 'world111_']>>>

### \W 匹配任何非数字,非字母字符>>> re.findall("\W","abc123?._")['?', '.']>>>

 
### \b 匹配一个特殊字符边界,比如空格 & # >>> re.findall(r"I\b","hello I am LIST")['I']>>>>>> re.findall("I\\b","hello I am LIST")['I']>>>
### 元字符之||:俗称管道符>>> re.findall("ka|b","asdffka|b")['ka', 'b']>>> re.findall("ka|b","asdffkab")['ka', 'b']>>>

### 元字符之分组()注:search()    # 匹配字符串,只要匹配到一个就不再往下匹配>>> re.findall("\d+","fadf55adfa85af58")['55', '85', '58']>>> re.search("\d+","fdfd58fdfd11df5df")<_sre.SRE_Match object at 0x028EFA68>    # 得到的是一个对象>>> re.search("\d+","fdfd58fdfd11df5df").group()    # 利用group得出结果'58'>>>>>> re.search("[a-z]+","123hello123abc").group()'hello'>>>

### (?P
[a-z]+)自定义一个分组,分组名称为id>>> re.search("(?P
[a-z]+)","123hello123abc").group()'hello'>>>>>> re.search("(?P
[a-z]+)\d","123hello123abc").group()'hello1'>>>>>> re.search("(?P
[a-z]+)\d+","123hello123abc").group()'hello123'>>>>>> re.search("(?P
[a-z]+)\d+","123hello123abc").group("id")'hello'>>>

## r

re.findall(r"I\b","hello I am LIST")

上方代码中 r 表示的作用:加上r表示对所处理的字符不做任何的转义,因为Python在进行解释时,会对转义字符进行转义,而re模块也会对转义字符进行转义,所以会照成干扰,加上r后,Python不对其进行转义,直接让re模块进行解释

\\b:Python对程序进行解释时,将其转义为\b,而后re模块对其进行解释,re表达式只能认为是 \b

r"\\b":Python对程序进行解释时,不进行转义,而直接给re模块进行处理

# 一种不使用 r 的方法re.findall("c\\\\l")python对其进行转义,转义成c\\l# 而后re对其再次进行转义,转义成c\l# 所以将\\\\转义成\
>>> re.findall("I\\\\l","hello I am LI\lST")['I\\l']>>># 注:上方的结果为两个反斜杠,因为返回到python中时又添加了一个,表示\

\. 表示一个普通点

\* 表示一个普通*

## re中常用的方法

#1findall

#2search

#3match("a","abc").group()    # 用法与search,不同于match只取头

#4>>> re.split("[ab]","abcd")    # 先按a进行分割,得到''和'bcd',再将''和'bcd’按b进行分割['', '', 'cd']

#5sub替换,具有三个参数>>> re.sub("\d+","A","hello1998World")    # 将其中的数字替换为A 'helloAWorld'>>> re.sub("\d","A","hello1998World")    # 将其中的每个数字替换为A'helloAAAAWorld'>>> re.sub("\d","A","hello1998World",2)        # 后加参数2,匹配前两个数字'helloAA98World'

#6>>> re.subn("\d","A","hello1998World")        # 输出匹配后的内容与匹配的次数('helloAAAAWorld', 4)

#7com = re.compile("\d")    # 将要匹配的规则存到com中# 可以重复使用com>>> com = re.compile("\d")>>> com.findall("dfadfd1fwe33adf")['1', '3', '3']

#8>>> re.finditer("\d+","efwerfqw1212rtfgwe4454")
>>># 与findall区别是返回一个迭代器对象# 好处:当处理大量数据是,不需要将所有的数据全部存放到内存中,而是存放到迭代器中>>> ret = re.finditer("\d+","efwerfqw1212rtfgwe4454")>>> next(ret).group() # 用next读取'1212'>>> next(ret).group()'4454'>>>

# 注注:当使用分组时,re默认会将括号中分组的内容优先拿出,如下所示>>> re.findall("www\.(baidu|sina)\.com","www.baidu.com")['baidu']

# 去优先级:加上?:>>> re.findall("www\.(?:baidu|sina)\.com","www.baidu.com")['www.baidu.com']

 

# 补充>>> re.findall("(abc)+","abcabcabc")    # 括号有优先级,只显示一个['abc']>>> re.findall("(?:abc)+","abcabcabc")    # 用?:取消优先级['abcabcabc']

 

转载于:https://www.cnblogs.com/Doaoao/p/10139833.html

你可能感兴趣的文章
47.论文网站监控采集数据源及功能结构图
查看>>
PCI Express(一)- Connector
查看>>
Puzzle, ACM/ICPC World Finals 1993, UVa227
查看>>
SecureCRT乱码
查看>>
ios,弹窗遮罩滚动穿透解决方案
查看>>
Javascript 检查 一个字符串中是否包含另一个子字符串
查看>>
递归函数
查看>>
ios的概述和了解的个人总结
查看>>
《文献管理与信息分析》第一章 学习笔记
查看>>
apache kafka系列之在zookeeper中存储结构
查看>>
Python初体验_基础(一)
查看>>
ORACLE 问题解决
查看>>
IOS 视图传值
查看>>
【转】WEB网站常见受攻击方式及解决办法
查看>>
【八】虚拟机工具 01 jps命令详解
查看>>
[转]五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)
查看>>
关于预编绎网站的问题[已预编译此应用程序的错误]
查看>>
BZOJ 4869: [Shoi2017]相逢是问候
查看>>
Solr数据备份
查看>>
系统管理模块_部门管理_实现基本的增删改查功能
查看>>