Python之字符串正则匹配
需求:
正则表达式匹配某个文本模式,但是它找到的是模式的最长可能匹配(因为是贪婪匹配 )。 而你想修改它变成查找最短的可能匹配。
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']
Python之字符串正则匹配的更多相关文章
- 【python】给正则匹配部分命名
可以用?P<name>的方法给正则匹配的部分命名. 例:要将<字母,数字>的部分命名为test x = "abc <haha,123> test @@&q ...
- python使用findall正则匹配出所有符合条件的字符串
# -*- coding:utf-8 -*- import re mystr="qqq key:www.baidu.com<br>key:www.tengxun.com<b ...
- iOS截取特定的字符串(正则匹配)
有时候我们会有需求从一个字符串中截取其他的字符串,根据情况的不同,我们来分析几种方法~~ 一. 固定长度字符串中截取固定位置长度的字符串 // 这是比较简单的一种情况:比如截取手机号的后4位 let ...
- 字符串正则匹配(递归/DP)
Wildcard-Matching & Regular Expression Matching Wildcard-Matching中?匹配任意一个字符,*匹配任意长度字符串包括空字符串 方法 ...
- php中的正则函数:正则匹配,正则替换,正则分割 所有的操作都不会影响原来的字符串.
有一个长期的误解, 如果要分组, 必须用 小括号 和 |, 而不能用 中括号 和 |. [ab|AB]表示的不是 匹配 ab或 AB, 而是表示 匹配 a,b, |, A, B 这5个字符中 的任意 ...
- [Python正则表达式] 字符串中xml标签的匹配
现在有一个需求,比如给定如下数据: 0-0-0 0:0:0 #### the 68th annual golden globe awards #### the king s speech earns ...
- Python正则匹配字母大小写不敏感在读xml中的应用
需要解决的问题:要匹配字符串,字符串中字母的大小写不确定,如何匹配? 问题出现之前是使用字符串比较的方式,比如要匹配'abc',则用语句: if s == 'abc':#s为需要匹配的字符串 prin ...
- 用python处理时间、utf8文本、正则匹配、序列化、目录路径搜索、xml解析
python 处理时间 import time import re now = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime()) ...
- Python中正则匹配使用findall时的注意事项
在使用正则搜索内容时遇到一个小坑,百度搜了一下,遇到这个坑的还不少,特此记录一下. 比如说有一个字符串 "123@qq.comaaa@163.combbb@126.comasdf111@a ...
随机推荐
- 36.Minimum Path Sum(最小路径和)
Level: Medium 题目描述: Given a m x n grid filled with non-negative numbers, find a path from top left ...
- Java使用Jsoup简单解析页面
jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址.HTML 文本内容.它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出 ...
- 卸载 Bash On Ubuntu On Windows
1.打开cmd,输入lxrun /uninstall /full,然后根据提示输入y即可开始卸载. 已失效
- 【记录】git 拉取远程分支代码,同步到另一个git上
最近有需求从某git 上拉取所有分支代码同步到另一git上,现记录操作步骤,以便日后使用: 1:先克隆其中一个分支代码到本地环境 git clone -b test http://账号:密码@XXX. ...
- HDU-4003 Find Metal Mineral 树形DP (好题)
题意:给出n个点的一棵树,有k个机器人,机器人从根节点rt出发,问访问完整棵树(每个点至少访问一次)的最小代价(即所有机器人路程总和),机器人可以在任何点停下. 解法:这道题还是比较明显的能看出来是树 ...
- expdp和impdp
前言 一句话 expdp和impdp,只能在本地服务器运行 使用前 1.创建逻辑目录,该命令不会在操作系统创建真正的目录,最好以system等管理员创建. create directory dpd ...
- 三、JPA增删改查常用方法
前言:创建EntityManager对象,需要先创建创建EntityManagerFactory对象 方式一:直接通过persistenceUnitName创建 String persistenceU ...
- 转 top、postop、scrolltop、offsetTop、scrollHeight、offsetHeight、clientHeight
1.top 此属性仅仅在对象的定位(position)属性被设置时可用.否则,此属性设置会被忽略. 复制代码 代码如下: <div style=" position:absolute; ...
- php结合Redis实现100万用户投票项目,并实时查看到投票情况的案例
场景:某网站需要对其项目做一个投票系统,投票项目上线后一小时之内预计有100万用户进行投票,希望用户投票完就能看到实时的投票情况 这个场景可以使用redis+mysql冷热数据交换来解决. 何为冷热数 ...
- AI加持的阿里云飞天大数据平台技术揭秘
摘要:2019云栖大会大数据&AI专场,阿里云智能计算平台事业部研究员关涛.资深专家徐晟来为我们分享<AI加持的阿里云飞天大数据平台技术揭秘>.本文主要讲了三大部分,一是原创技术优 ...