python正则表达式开头和结尾_Python 基础之正则之一 单字符,多字符匹配及开头结尾匹配...
一.正则表达式之单个字符匹配
格式:lst = re.findall(正则表达式,要匹配的字符串)
预定义字符集 匹配内容
.匹配任意字符,除了换行符\n
\d匹配数字
\D匹配非数字
\w匹配字母或数字或下划线 (正则函数中,支持中文的匹配)
\W匹配非字母或数字或下划线
\s匹配任意的空白符
\S匹配任意非空白符
\n匹配一个换行符
\t匹配一个制表符
[]匹配中括号内列举的字符
字符组格式 说明 [默认必须从字符组中选一个]
|---|---|
[...]匹配字符组中的字符|
[^...]匹配除了字符组内所有内容,之外的所有字符|
字符组内容|待匹配字符|匹配结果|说明|
|---|---|---|---|
[0123456789]8 True字符组里枚举的各种字符,必须满足一个,否则返回假,不匹配
[abcdefg]9False由于字符组中没有"9"字符,所以不匹配
[0-9]7True可用-表示范围,[0-9]和[0123456789]是一个意思
[a-z]s True [a-z]匹配所有的小写字母
[A-Z]B True[A-Z]就表示所有的大写字母
[0-9a-fA-F]e True可以匹配数字,大小写形式的a-f.该正则可验证十六进制
以下对上述匹配符合及使用方法进行举例:
import re
lst = re.findall(正则表达式,要匹配的字符串)
\d匹配数字\D匹配非数字
lst = re.findall("\d",'123qwe456asd')
print(lst)
#结果为: ['1', '2', '3', '4', '5', '6']
lst = re.findall("\D",'123qwe456asd')
print(lst)
#结果为:['q', 'w', 'e', 'a', 's', 'd']
\w字母,数字,下划线,包含中文(正则函数当中支持中文的匹配)\W匹配非字母或数字或下滑线
lst = re.findall('\w',"d&*()qh321>wi")
print(lst)
#结果为:['d', 'q', 'h', '3', '2', '1', 'w', 'i']
lst = re.findall('\W',"d&*()qh321>wi")
#结果为:['&', '*', '(', ')', '>']
print(lst)
\s匹配任意空白符\S匹配任意非空白符
strvar = """
"""
lst = re.findall('\s',' ')
print(lst)
#结果为: [' ', ' ', ' ', ' ', ' ']
lst = re.findall("\S",strvar)
print(lst)
#结果为: [] #因为strvar里面没有空白符,没有匹配到内容,所有返回空列表
lst = re.findall("\S"," DQHh dq")
print(lst)
#结果为: ['D', 'Q', 'H', 'h', 'd', 'q'] #是去掉空白符的所有字符形成的列表
\n匹配换行\t匹配一个制表符
strvar = """
今天 天气 晴朗
"""
strvar2 = """
\t \tdqwdq
wd \t qq
"""
lst = re.findall(r"\n",strvar)
print(lst)
#结果为: ['\n', '\n']
print("==========")
lst = re.findall(r"\t",strvar2)
print(lst)
#结果为: ['\t', '\t', '\t']
# ###字符组练习,必须从字符组选一个,如果一个都没有则匹配不成功
#举例: []匹配中括号内列举的字符
lst = re.findall("[123]","qwo1293dboh")
print(lst)
#结果为: ['1', '2', '3']
#中间的[a-g] 表示字母a到g中出现的字母就符合匹配条件
print(re.findall("a[a-g]b",'aab abb acb adb'))
#结果为:['aab', 'abb', 'acb', 'adb']
#在a与b之间是一位0到9的数就符合匹配
print(re.findall('a[0123456789]b','a1b a2b acb ayb a9090909009b'))
# 优化版:0123456789 => 0-9 等价
print(re.findall('a[0-9]b','a1b a2b acb ayb a9090909009b'))
#结果为:['a1b', 'a2b']
#在a与b之间的那一位字符是出现a到g的之间的字母就匹配
print(re.findall('a[abcdefg]b','a1b a2b a3b acb ayb adb '))
# 优化版:a b c d .... z => a-z
print(re.findall('a[a-g]b','a1b a2b a3b acb ayb adb '))
#结果为: ['acb', 'adb']
print("================")
#中间的那一位字符可以是数字和大小写字母
print(re.findall('a[0-9a-zA-Z]b','a-b aab aAb aWb aqba1b a8d a6b aaa5b231'))
# 优化版: a-zA-Z => A-z 可以匹配所有大小写,但是有缺陷,一些特殊符号也匹配到了
#结果为: ['aab', 'aAb', 'aWb', 'aqb', 'a1b', 'a6b', 'a5b']
print(re.findall('[A-z]','('))
#字母不包括( ,所有没有匹配到,返回空列表
#结果为: []
print(re.findall('[0-z]','9')) # 语法上允许,但是别这么用,没意义
#a与b 中间需要匹配两个字符一个是0-9,另外一个是 * # / 其中选一个
print(re.findall('a[0-9][*#/]b','a1/b a2b a29b a56b a456bab'))
#结果为: ['a1/b']
# ^ 字符组中的^ 代表除了的意思
print(re.findall('a[^-+*/]b',"a%b ccaa*bda&bd"))
#结果为: ['a%b', 'a&b']
二.匹配多个字符=> [元字符]量词符号
量词
用法说明:
?重复0次或1次
+ 重复1次或多次(至少1次)
*重复0次或多次(任意次)
{n}重复n次
{n,}重复n次或更多次(至少n次)
{n,m}重复n到m次
.* .+贪婪模式匹配
.*? .+?非贪婪模式匹配
# 贪婪匹配:尽量多向后匹配 底层利用回溯算法
# 非贪婪匹配:尽量少向后匹配
(1)量词加上问号?表示非贪婪 惰性匹配
(2).*?w 表示匹配任意长度任意字符遇到一个w就立即停止
import re
# (1) ?匹配0个 或者1个a
print(re.findall('a?b', 'abbzab abb aab aaxqab'))
# ['ab', 'b', 'ab', 'ab', 'b', 'ab', 'ab']
# (2) +匹配1个或者多个a #必须要有a ,没有a的就不符合
print(re.findall('a+b', 'abbzab abb aab aaxqab'))
# ['ab', 'ab', 'ab', 'aab', 'ab']
# (3) *匹配0个或者多个a
print(re.findall('a*b', 'abbzab abb aab aaxqab'))
# 可以没有,可以有,也可以多个
# ['ab', 'b', 'ab', 'ab', 'b', 'aab', 'ab']
# (4) {m,n}匹配m个至n个a
print(re.findall('a{1,3}b', 'abbzab abb aab aaxqab aaaaaab'))
# 只有存在1个a或者以上到3个a的情况才匹配
# ['ab', 'ab', 'ab', 'aab', 'ab', 'aaab']
print(re.findall('a{1}b', 'abbzab abb aab aaxqab aaaaaaaaaab'))
# ['ab', 'ab', 'ab', 'ab', 'ab'] 只匹配一个a的
print(re.findall('a{1,}b', 'abbzab abb aab aaxqab aaaaaaaaaab'))
# ['ab', 'ab', 'ab', 'aab', 'ab', 'aaaaaaaaaab'] 只有存在1个a或者以上就匹配
#贪婪匹配 与 非贪婪匹配[语法:量词的后面加?号]贪婪匹配:默认向更多次数匹配,底层用的是回溯算法;非贪婪匹配:默认向更少次数匹配在量词的后面加一个?号,就是非贪婪模式,例如:.*? .?? .+? .{m,n}? .*?用的更多如果遇到了子这个字,在非贪婪模式下,匹配到第一个就返回回溯算法:从左向右进行匹配,一直向后找,直到再也找不到了,回头,拿离右侧最近的那个值
#普通例子:
strvar = "刘能和刘铁锤和刘大棍子12313子"
lst = re.findall("刘.", strvar)
print(lst)
# ['刘能', '刘铁', '刘大']
# 1.贪婪匹配
lst = re.findall("刘.?", strvar) # .? 匹配一个字符,重复0次或1次
print(lst)
# ['刘能', '刘铁', '刘大']
lst = re.findall("刘.+", strvar) # + 重复1次或多次,因为贪婪所有就无限重复匹配一个字符
print(lst)
# ['刘能和刘铁锤和刘大棍子12313子']
lst = re.findall("刘.*", strvar) # 重复0次或多次,也是因为贪婪所以重复匹配一个字符
print(lst)
# ['刘能和刘铁锤和刘大棍子12313子']
lst = re.findall("刘.*子", strvar)
print(lst)
# ['刘能和刘铁锤和刘大棍子12313子']
# strvar1 ="刘123456789123456789121子"
lst = re.findall("刘.{1,20}子", strvar) # 刘和子的中间可以匹配最多20个字符,如果是上面一行的strvar1会输出空列表
print(lst, "<==>")
# ['刘能和刘铁锤和刘大棍子12313子'] <==>
#非贪婪匹配
strvar = "刘能和刘铁锤和刘大棍子12313子"
lst = re.findall("刘.??", strvar) # 因为非贪婪,所有?重复0次或1次就变成匹配0次就符合了
print(lst)
# ['刘', '刘', '刘']
lst = re.findall("刘.+?", strvar) # 因为非贪婪模式+ 重复1次或多次,即重复一次就符合
print(lst)
# ['刘能', '刘铁', '刘大']
lst = re.findall("刘.*?", strvar) # 因为非贪婪,所有*重复0次或多次就变成匹配0次就符合了
print(lst)
# ['刘', '刘', '刘']
# 匹配到第一个子就直接返回
lst = re.findall("刘.*?子", strvar) # 从刘开始到第一个子就结束
print(lst)
# ['刘能和刘铁锤和刘大棍子']
lst = re.findall("刘.{1,20}?子", strvar)
# 原来有更大的匹配到了,但是非贪婪选择短的符合匹配的就输出,最多中间匹配20次单个任意字符,20个以上就不符合
print(lst)
# ['刘能和刘铁锤和刘大棍子']
三.匹配开头结尾=> [元字符]边界符号
1.\b
\b用来匹配边界\b退格backspace是一个转义字符一般写正则表达式的时候,字符串的前面加上一个r,让转义字符失效
# word 匹配d 为右边界 d\b 匹配w为左边界\bw 贪婪匹配
lst = re.findall(r".*d\b", "word pwd abc") # d的前面匹配一次或者多次,贪婪算法匹配多次及时到符合的仍然继续匹配知道没有符合的获取最长的那个符合的
print(lst)
# ['word pwd']
# 非贪婪匹配
lst = re.findall(r".*?d\b", "word pwd abc") ##d的前面匹配一次或者多次,非贪婪算法匹配多次到最短符合就获取
print(lst)
# ['word', ' pwd'] #注意pwd之前有个空格,也是匹配到的字符
# 优化版:舍掉空格 \S 匹配任意非空白符 ,下面就会将单词之间的空格去掉
lst = re.findall(r"\S*?d\b", "word pwd abc")
print(lst)
# ['word', 'pwd']
# 匹配单词的左边界
lst = re.findall(r"\bw.* ", "word abc") # 在*后面有个空格,就是标识匹配到空格,所有这个匹配到'word ' 这边也存在贪婪算法
print(lst)
# ['word ']
2.^必须以某个字符开头,后面的字符无所谓
3.$必须以某个字符结尾,前面的字符无所谓
如果正则里面包含了^或者$意味着要把字符串看成一个整体
strvar = "大哥大嫂大爷"
print(re.findall('大.', strvar))
# ['大哥', '大嫂', '大爷']
print(re.findall('^大.', strvar))
# ['大哥']
print(re.findall('大.$', strvar))
# ['大爷']
print(re.findall('^大.$', strvar)) # 没有匹配到符合的,所有输出空列表
# []
print(re.findall('^大.*?$', strvar)) # 字符串是一个整体,所有要匹配到结尾的字符
# ['大哥大嫂大爷']
print(re.findall('^大.*?大$', strvar))
# [] #因为字符串中有以大开头,但是没有大结尾,所有匹配没有符合的,返回空列表
print(re.findall('^大.*?爷$', strvar))
# ['大哥大嫂大爷']
# 把字符串看成一个整体,只要一个结果
print(re.findall('^g.*? ', 'giveme 1gfive gay '))
# ['giveme ']
print(re.findall('five$', 'aassfive'))
# ['five']
print(re.findall('five$', 'aassfive00'))
# [] #没有以e结尾的
print(re.findall('^giveme$', 'giveme'))
# ['giveme']
print(re.findall('^giveme$', 'givemeq'))
# [] #没有符合以g开头以e结尾的
print(re.findall('^giv.me$', 'giveme'))
# ['giveme'] #中间那个.可以为任意字符,以g开头和以e结尾外加字符符合
print(re.findall('^giveme$', 'giveme giveme'))
# [] #没有符合的
print(re.findall('giveme', 'giveme giveme')) # 符合两个
# ['giveme', 'giveme'] #没有以什么开头或以什么结尾,只要字符符合就可以符合
print(re.findall("^g.*e", 'giveme 1gfive gay'))
# ['giveme 1gfive'] #注意贪婪算法
print(re.findall("^g.*?e", 'giveme 1gfive gay'))
# ['give'] #非贪婪算法,遇到最短符合的字符串就获取
python正则表达式开头和结尾_Python 基础之正则之一 单字符,多字符匹配及开头结尾匹配...相关推荐
- python 正则表达式(Regular Expression)基础学习笔记
python 正则表达式(Regular Expression) 正则表达式基础 search():只返回第一个匹配的字符串 findall():将搜寻结果以列表方式返回 import re # 导入 ...
- python中print的本质_Python基础语法全解
一.Python简介 1. 了解Python Python是一种解释型(这意味着开发过程中没有了编译这个环节).面向对象(支持面向对象的风格或代码封装在对象的编程技术).动态数据类型的交互式(可在命令 ...
- python输入一个字母标识符_Python基础入门语法和变量类型(一)
1 基础语法 标识符 标识符由字母.数字和下划线(_)组成,其中不能以数字开头,并且区分大小写. 以下划线开头的标识符是有特殊意义的: 单下划线开头的如 _foo,表示不能直接访问的类属性,需要通过类 ...
- python正则表达式中括号的用法_Python的正则表达式中的圆括号到底如何使用?
这个问题并不太严重,严格来说我这样提问有些草率,不过也有人关注那我就把自己百度探究的结果写一写好了,有错误则请指出来. 首先是文档说明: >>> import re >> ...
- python 字符串转字典 编码_python基础--2(字符串、元组、列表、字典、集合、文件、编码转码)...
python支持的数据类型 int 整数型 float 浮点型 complex 复数,实数+虚数,虚数部分以"j"或"J"结尾,a+bj或者complex(a, ...
- python语法基本组成单位_Python基础语法总结
学习任何一门编程语言,首先要了解这门编程语言的语法要求,掌握好基础语法是学好一门编程语言的第一步 1.程序组成及标识符 Pyhton程序是由语句和表达式组成的,示例代码如下图所示. 语句一般是使用关键 ...
- python qtextedit设置光标位置_Python基础命令学习——就这一篇文章就够了
一.python的定义: python是一种计算机程序设计语言,是一种解释型.编程型的脚本语言. 发现有很多想要学习Python却不知道如何下手的朋友,我这里整理了一些关于Python的学习资料,从基 ...
- python 只取年月日 字符串_Python基础:数据类型和变量amp;字符串和编码
Python基础:1.数据类型和变量 数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网 ...
- python数字类型及运算_Python基础之(基本数据类型及运算)
一.运算 1.1.算数运算 1.2.比较运算: 1.3.赋值运算: 1.4.逻辑运算: 1.5.成员运算: 针对逻辑运算的进一步研究: 1.在没有()的情况下not 优先级高于 and,and优先级高 ...
最新文章
- centos 6.8 x86_64下autoconf版本升级到2.69
- Nginx配置文件nginx.conf中文详解
- ubuntu 构建 deb 安装包
- 来来来!一次搞定各种数据库 SQL 执行计划:MySQL、Oracle
- python图像分割算法_OpenCV-Python 图像分割与Watershed算法 | 三十四
- android studio table居中代码_html table表格标签内容如何居中显示?表格的align属性的用法介绍...
- 【51NOD】1006 最长公共子序列Lcs(动态规划)
- springboot 统一异常处理
- Linux:sudo命令实例讲解
- windows下USB检测插拔状态
- MAven实战 测试
- PS 做动态图视频教程
- python股票收益率协方差_Python如何评估投资组合的收益率和风险
- 三、字符串拼接和占位符
- 使用特征函数计算随机变量的数学期望和方差
- Java代码获取网络和本地视频时长等信息
- 资产监测设备中法国配置工具介绍(二)
- 408-机组一些小知识点
- 贪吃蛇大作战ai_二 贪吃蛇大作战!
- ubuntu 安装 docker swarm 集群
热门文章
- 基于 Apache Flink Table Store 的全增量一体实时入湖
- 数据处理-数据可视化-折线图的绘制/柱状图绘制(指数级坐标轴)(python版)
- python arduino i2c1602_Arduino通过I2C控制1602LCD显示屏
- 2021-06-10 Multisim的74LS192功能表及555时基74LS190
- 流量矿石功能升级,充分发挥快播“匠心”精神
- python解析原理_主成分分析法原理及其python实现
- [转载] 黑鹰完完全全学习注册表——剖析注册表文件体系
- 无法启动此程序因为计算机中丢失d3dx9_36.dll,xp系统运行真三国无双游戏提示d3dx9_36.dll丢失的解决方法...
- android qq聊天窗口切换,手机QQ重磅更新!新增聊天多窗口模式,希望微信也能有...
- 热门游戏遭病毒团伙利用,中招者电脑被远程操控