我的第二十九篇博客---正则进阶

re.match() 从头找一个
re.search() 找一个
re.findall() 找所有
返回一个列表,没有就是空列表
re.findall(‘\d‘,‘chuan1zhi2‘) 结果为[‘1‘,‘2‘]

re.sub() 替换

re.sub(‘\d‘,‘_‘,‘chuan1zhi2‘) 结果为[‘chuan_zhi_‘]

re.compile(编译)
返回一个模型p,具有和re一样的方法,但是传递的参数不同
匹配模式需要传到compile中
如果不使用re.S参数,则只在每一行内进行匹配,如果一行没有,就换下一行重新开始,不会跨行。而使用re.S参数以后,正则表达式会将这个字符串作为一个整体,将‘\n‘当作一个普通的字符加入到这个字符串中,在整体中进行匹配。
p=re.compile(‘\d‘,re.S)
p.findall(‘chuan1zhi2‘)

匹配中文
在某些情况下,我们想匹配文本中的汉字,有一点需要注意的是,中文的unicode编码范围主要在[u4e99-u9fa5],这里说主要是因为这个范围并不完整,比如没有包括全角(中文)标点,不过,在大部分情况下,应该是够用的。
假设现在想把字符串 title=u‘你好,hello,世界‘ 中的中文提取出来,可以这么做:
import re
title=u‘你好,hello,世界‘
pattern=re.compile(‘[\u4e99-\u9fa5]+‘)
result=pattern.findall(title)
print(result)

findall:

import re
s=‘abcasdc‘
r=re.findall(‘ab.*?c‘,s)
r

结果为:abc

不加问号结果为
abcasdc

加了问好是非贪婪匹配

import re
s=‘abcasdc‘
r=re.findall(‘ab(.*)c‘,s)
r

结果为casd

加了括号只匹配出括号内的内容
如果有多个括号 结果是以元祖的形式,外面套个[]

用了findall,结果都是一个列表

re.sub() 替换

re.sub(‘\d‘,‘_‘,‘chuan1zhi2‘) 结果为[‘chuan_zhi_‘]

加了re.I就不区分大小写

re.findall(‘<a>(.*)</a>‘,content,re.S)
可以多行匹配
内容中间有换行也可以匹配

什么是正则表达式的贪婪与非贪婪匹配

  如:String str="abcaxc";

    Patter p="ab.*c";

  贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。如上面使用模式p匹配字符串str,结果就是匹配到:abcaxc(ab.*c)。

  非贪婪匹配:就是匹配到结果就好,就少的匹配字符。如上面使用模式p匹配字符串str,结果就是匹配到:abc(ab.*c)。

2.编程中如何区分两种模式

  默认是贪婪模式;在量词后面直接加上一个问号?就是非贪婪模式。

  量词:{m,n}:m到n个

     *:任意多个

     +:一个到多个

     ?:0或一个

括号:

import re

string="abcdefg acbdgef abcdgfe cadbgfe"

#带括号与不带括号的区别
#不带括号
regex=re.compile("((\w+)\s+\w+)")
print(regex.findall(string))
#输出:[(‘abcdefg acbdgef‘, ‘abcdefg‘), (‘abcdgfe cadbgfe‘, ‘abcdgfe‘)]

regex1=re.compile("(\w+)\s+\w+")
print(regex1.findall(string))
#输出:[‘abcdefg‘, ‘abcdgfe‘]

regex2=re.compile("\w+\s+\w+")
print(regex2.findall(string))
#输出:[‘abcdefg acbdgef‘, ‘abcdgfe cadbgfe‘]
复制代码
第一个 regex 中是带有2个括号的,我们可以看到其输出是一个list 中包含2个 tuple

第二个 regex 中带有1个括号,其输出的内容就是括号匹配到的内容,而不是整个表达式所匹配到的结果。

第三个 regex 中不带有括号,其输出的内容就是整个表达式所匹配到的内容。

结论:findall()返回的是括号所匹配到的结果(如regex1),多个括号就会返回多个括号分别匹配到的结果(如regex),如果没有括号就返回就返回整条语句所匹配到的结果(如regex2)。所以在提取数据的时候就需要注意这个坑。

   实际上是由其并不是python特有的,这是 正则 所特有的 , 任何一门高级语言使用正则都满足这个特点:有括号时只能匹配到括号中的内容,没有括号【相当于在最外层增加了一个括号】。在正则里面 “()” 代表的是分组的意思,一个括号代表一个分组,你只能匹配到"()"中的内容

原文地址:https://www.cnblogs.com/sll-csdn/p/10926094.html

时间: 2024-07-31 12:09:58

我的第二十九篇博客---正则进阶的相关文章

我的第十九篇博客---JavaScript基本操作

通过条件来控制程序的走向,就需要用到条件语句条件运算符:==, ===, >, >=, <, <=, !=, &&(而且), ||(或者), !(否) if elsevar iNum01=3;var iNum02=5;var sTr;if (iNum01>iNum02){ sTr='大于';}else{ sTr='小于';}alert(sTr); 多重 if else 语句var iNow=1;if(iNow==1){ ...;}else if (iNow==

我的第二十八篇博客---seleinum

from selenium import webdriver #初始化驱动driver=webdriver.Chrome()#请求页面driver.get(url='https://www.baidu.com')#找到对应标签,发送文本driver.find_element_by_xpath("//*[@id='kw']").send_keys('2019') #找到按钮,点击clickdriver.find_element_by_xpath("//*[@id='su']&q

我的第二十二篇博客---VUE

Vue.js基本概念:首先通过将vue.js作为一个js库来使用,来学习vue的一些基本概念,我们下载了vue.js后,需要在页面上通过script标签引入vue.js.开发中可以使用开发版本vue.js.产品上线要换成vue.min.js. <script type="text/javascript" src="../static/js/vue.js"></script>Vue实例 每个Vue应用都是通过实例化一个新的Vue对象开始的: &

阅读架构漫谈九篇博客有感-1500字

架构漫谈是由资深架构师王概凯撰写的系列专栏,逐步讨论什么是架构.怎样做好架构.软件架构如何落地.如何写好程序等问题. 架构漫谈分为九篇: 什么是架构? 认识概念是理解架构的基础 如何做好架构之识别问题 如何做好架构之架构切分 什么是软件 软件架构到底是要解决什么问题? 不要空设架构师这个职位,给他实权 从架构的角度看如何写好代码 理清技术.业务和架构的关系 第一篇 什么是架构? 主要讲到了缘起,什么是架构和为什么会产生架构. 由于问题越来越复杂,一个人已经很难完成想要完成的事情,而许多人一起却可

第二十九篇:浅谈一线经理的管理策略

今天看到一条朋友圈中的内容:好单位与坏单位 文中列举了好与坏的各种分别: 好公司: 牛人很多,比你更谦卑,更努力,你不努力都不好意思呆下去! 员工都有目标有理想有希望 每个人脸上都写着"价值与目标" 坏公司: 扯皮,推诿,不承担,办事效率低,发牢骚的人很多, 不仅不干活,而且党同伐异,想把干活的人全干掉! 员工以混日子,不承担责任,得过且过去生存. 每个人的脸上都写着"自我与个性" 具体到一个公司,都是好公司与坏公司的结合体. 刚刚起步的STARTUP,大家都是志同

第二十九篇、CoreAnimation的使用

使用的的三个步骤 1.初始化演员 2.设置好剧情 3.播放 附录:一个把商品添加到购物车的抛物线动画 coreAnimation // 1.初始化演员 CALayer *layer = [[CALayer alloc]init]; layer.bounds = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height); layer.position = C

DataSnap起源于MIDAS(十几篇博客)

作为MIDAS起始于Delphi3,Delphi4是MIDAS II,Delphi5中是MIDASIII,而后基于COM远程数据模块方式使用TCP/IP,HTTP,(D)COM构建出强大的通讯能力.从Delphi6开始改名为DataSnap,直到D2007这个框架一直在使用.D2009重新架构了DataSnap—移除COM依赖,使用TCP/IP以更轻量级的方式生成远程服务对象和客户端连接能力.同时提供了与Delphi Prism2009开发的.NET程序通讯的功能.Delphi2010中构建于D

第二十九篇:使用SOUI的SMCListView控件

列表控件是客户端应用最常用的控件之一.列表控件通常只负责显示数据,最多通知一下APP列表行的选中状态变化. 现在的UI经常要求程序猿在列表控件里不光显示内容,还要能和用户交互,显示动画等等,传统的列表控件对于这样的需求基本是无能为力了. Android开发中很多界面都直接采用ListView实现,ListView中每一个Item中都可以容纳其它控件,这样的设计使得在表项中的交互和在主面板上交互一样简单. 虽然在列表项中容纳其它控件并不是什么新的思想,考虑到列表中的数据量是不确定的,如果给每一个表

第二十九篇:USER MODE DLL开发过程中的调试技巧心得分享

最近由于项目需要,被老板安排开发一个WINDOWS USER MODE DLL, 即WINDOWS用户模式下的动态链接库. 写代码,实现具体的功能这类初等工作,对于大多数软件开发工程师来讲,只是时间与工作量上的问题,具体的WINDOWS DLL的知识点,本人参考了Jeffrey Richter的<WINDOWS核心编程>中的DLL几章,不再熬述. 这里谈一下关于USER MODE DLL在调试过程中所涉及到的一些知识点,以及它们彼此之间的关系: 1. DebugBreak / int 3; 2