需求:

正则表达式匹配某个文本模式,但是它找到的是模式的最长可能匹配(因为是贪婪匹配 )。 而你想修改它变成查找最短的可能匹配。
import re
text2 = 'Computer says "no." Phone says "yes."'
str_pat=re.compile(r'"(.*)"')   # 匹配引号包裹的任意文本,并编译
print(str_pat.findall(text2))   #['no." Phone says "yes.'],并不是我们想要的['no.', 'yes.'],由于正则表达式* 匹配0到人一多次,是贪婪匹配
# 解决方式
new_str_pat=re.compile(r'"(.*?)"')
print(new_str_pat.findall(text2))  # ['no.', 'yes.']

多行匹配模式
comment = re.compile(r'/\*(.*?)\*/')
text1 = '/* this is a comment */'
text2 = '''/* this is a
multiline comment */
'''
print(comment.findall(text1))  # [' this is a comment ']
# [' this is a comment ']
print(comment.findall(text2))  # []

new_comment=re.compile(r'/\*((?:.|\n)*?)\*/')   # (?:)    指定非捕获组 不捕获匹配的文本,也不给此组分配组号。
print(new_comment.findall(text2))  # [' this is a\nmultiline comment ']  定义了一个仅仅用来做匹配,而不能通过单独捕获或者编号的组)。

补充:捕获组和非捕获组

捕获组
什么是捕获呢?使用小括号指定一个子表达式后,匹配这个子表达式的文本(即匹配的内容)可以在表达式或者其他过程中接着用,怎么用呢?至少应该有个指针啥的引用它吧? 对!默认情况下,每个分组(小括号)会自动拥有一个组号,从左到右,以分组的左括号为标志,第一个出现的分组组号为1,后续递增。如果出现嵌套,
(\d+)/(\d+)/(\d+)
# group1 group2 group3 取捕获组的值

(?:)(?=)(?<=)非捕获组非捕获组举例子:
# (?:)非捕获组
a = "6000¥ 和 1000$"
# 需求是得到金额和货币种类
# 捕获组
print(re.findall(r"(\d+)+([$¥])",a))  # [('6000', '¥'), ('1000', '$')]

a = "10010.86¥"
# 需求是得到金额和货币种类,提炼出 10010 和 ¥
# (?:)非捕获组(),可以理解为只分组而不捕获
print(re.findall(r"(\d+)(?:\.?)(?:\d+)([¥$])$",a))  # [('10010', '¥')# 非捕获 (?=)和(?<=) 前后查找,有的资料把它们叫做肯定式向前查找和肯定式向后查找;
b="12332aa438aaf"print(re.findall(r"[0-9a-z]{2}(?=aa)",b))  #['32', '38'] 该正则的意思是 匹配这么一个字符串,它要满足:是两位字符(数字,或字母),且后面紧跟着两个a
# 分析:44aa 这个子串满足这个条件,所以可以匹配到,又因为 (?=) 的部分是不捕获的,所以输出的只是 44,不包括aa,后面的同理
# 再深入看一下:
# 当str第一次匹配成功输出 32 后,程序要继续向后查找是否还有匹配的其它子串。那么这时应该从 32aa 的后一位开始向后查找,还是从 32 的后一位呢?
# 也就是从索引 5 开始还是从 7 开始呢?有人可能想到是从 32aa 的下一位开始往后找,
# 因为 32aa 匹配了正则,所以下一位当然是它的后面也就是从 4 开始。但实际上是从 32 的后一位也就是第一个 a 开始往后找。原因还是 (?=) 是非捕获的# 下面说一下 (?<=) 向前匹配
print(re.findall(r"(?<=aa)[0-9a-z]{2}",b))  # ['43']

 

转载于:https://www.cnblogs.com/zzy-9318/p/10457951.html

Python之字符串正则匹配相关推荐

  1. python中的正则匹配知识点

    @author: fighter Python正则表达式知识点整理. 概述:在处理字符串时,经常会遇到查找符合某些复杂规则字符串的需求,正则表达式就是用于描述这些规则的工具. 首先,我们先掌握一下py ...

  2. 两步处理字符串正则匹配得到JSON列表

    先说一下为什么要做这个事情 这几天遇见个比较毒的问题,elementplus的table表格不是要键值对对应的json数据列表来显示数据嘛. 我写的一个小项目用的后端是go语言,本意是后端在数据库得到 ...

  3. Python中的 正则匹配

    正则匹配的基本格式 import re ret=re.match("正则表达式","要匹配的字符串") ret.group( ) 提取数据 匹配单个字符: . ...

  4. iOS截取特定的字符串(正则匹配)

    有时候我们会有需求从一个字符串中截取其他的字符串,根据情况的不同,我们来分析几种方法~~ **一. ** 固定长度字符串中截取固定位置长度的字符串 // 这是比较简单的一种情况:比如截取手机号的后4位 ...

  5. 每天一道LeetCode-----只可能有'.'和'*'的字符串正则匹配

    Regular Expression Matching 原题链接Regular Expression Matching 意思是模拟正则表达式的. *操作,判断给定的目标字符串p是否匹配源字符串s. 规 ...

  6. Java与Python中的正则匹配

    Java实现 import java.util.regex.Matcher; import java.util.regex.Pattern;public class Test {public stat ...

  7. python识别人名-正则匹配百家姓

    # coding:utf-8 import re name = input("输入你的姓名:")   pattern = r'[赵|钱|孙|李|周|吴|郑|王|冯|陈|褚|卫|蒋| ...

  8. python 正则匹配

    在python 中,正则匹配用到的还是挺多的,下面总结一下常用的一些正则匹配: 精确匹配: \d可以匹配一个数字, \w可以匹配一个字母或数字, . 匹配任意的单个字符 \s可以匹配一个空格(也包括T ...

  9. Python中正则匹配与中文的问题

    笔者改写了一个爬虫,来爬取补天SRC的漏洞认领页面,将单位名称.漏洞名称.漏洞危害等级爬取下来,但是在正则匹配"漏洞名称"的过程中遇到了一些麻烦. 如上图,想要把"SQL ...

最新文章

  1. 其他算法-浅谈小波变换
  2. 后量子密码芯片研究取得重大突破,论文入选ISSCC 2022和CHES 2022
  3. Python文本处理:解析json格式的数据
  4. etcd 集群故障(数据变成只读)
  5. Shell+Linux命令实现日志分析
  6. Mybatis的insert方法
  7. 报名 | “智见AI”SpringCamp:物体检测与深度神经网络模型设计
  8. 三步在MacOS Anaconda安装ligthGBM
  9. 一些前端开发经典书籍推荐和下载链接分享
  10. 【原】AMR音频解码插件开发总结
  11. 橡皮擦的英语_从填字涂鸦到英语启蒙,家长口中的儿童版“秘密花园”涂色游戏测评【玩具测评】...
  12. python tclerror_Python Tk _tkinter.TclError:无效的命令名称“.42818376”
  13. 论文阅读:Spatial context-aware network for salient object detection
  14. python对医学图像的基本处理_python OpenCV 实现图片的医学处理
  15. 笔记本电脑亮度无法调节问题
  16. 苹果官方付费升级内存_vivo推出内存扩容服务:良心还是坑钱?
  17. 企业微信发送、撤回消息 java代码
  18. 猴子选大王(python)
  19. Streamsets相关资料汇总
  20. 图片热区自适应和设置热区边框

热门文章

  1. 被调用的对象已与其客户端断开连接 win10_【完整案例】基于Socket开发TCP传输客户端...
  2. python异步线程算法应用_Python多线程----线程池以及线程实现异步任务
  3. select case语句_图解Go select语句原理
  4. suse 调整分区_安装suse linux如何手工分配各个分区大小?
  5. g的python实现_Python Gevent
  6. python语言翻译成汇编语言_计原 || 1计算机语言发展与计算机层次结构
  7. OpenCV-Python实战(21)——OpenCV人脸检测项目在Web端的部署
  8. linux vim命令_提升生产力的20大Linux Vim命令
  9. java队列 双队列_Java队列– Java队列
  10. 编程课课程感想和建议_最佳在线编程课程