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‘]
 

原文地址:https://www.cnblogs.com/zzy-9318/p/10457951.html

时间: 2024-10-26 05:39:21

Python之字符串正则匹配的相关文章

关于Boost,C Regex对短目标字符串正则匹配的性能分析

昨天对长目标字符串下的各种正则匹配库性能进行了总结,得出结论是Boost regex性能最佳.今天将其应用到项目当中,果不其然,长字符串匹配带来的性能损失基本没有了,当然,目前规模并不算太大,但是在可预计规模内Boost可以完全达到要求. 不过有一点,在Boost,C同时去除长字符串匹配的影响后,剩下都是短字符串匹配,发现Boost比C好的并不是好很多,例如10000+次短字符匹配中,其中包含匹配成功和不成功的,Boost regex+系统其他模块用时130ms左右,而C regex+系统其他模

【python】给正则匹配部分命名

可以用?P<name>的方法给正则匹配的部分命名. 例:要将<字母,数字>的部分命名为test x = "abc <haha,123> test @@" pattern = "(?P<test>\<\w+,\d+\>)" m = re.search(pattern, x) r = m.group("test") print r 输出: <haha,123> 原文地址:http

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

有时候我们会有需求从一个字符串中截取其他的字符串,根据情况的不同,我们来分析几种方法~~ 一. 固定长度字符串中截取固定位置长度的字符串 // 这是比较简单的一种情况:比如截取手机号的后4位 let phoneNum = "18515383061" var suffixNum:String? // 从倒数第四位开始截取,截取到最后 suffixNum = phoneNum.substringFromIndex(phoneNum.endIndex.advancedBy(-4)) // 从

特定中文字符串正则匹配

最近遇到了一个匹配中文特定字符串的问题,记录下来 问题描述:匹配"美丽乡村"中的一个字符或几个,如果是多个字符,顺序不能改变,如"丽乡" 解决过程: 之前知道匹配中文字符串,正则表达式中使用的是unicode编码的范围,如/^[x{4e00}-x{9fa5}]+$/u 想着特定字符是否可以不用转换成unicode编码,于是写出正则  '/^[美]{0,1}[丽]{0,1}[乡]{0,1}[村}]{0,1}$/u',总不能正确匹配 于是把汉字改成unicode编码,正

python中RE正则匹配模块的用法若干

# -*- coding:utf-8 -*-import import reload()('utf-8')= [() for in ['this''that']]   # 编译一个匹配模板对象列表,该列表匹配模板编译源来自一个二元列表= 'Does this text match the pattern?'print 'Test:'' 'for in :                   # 查找每一个模板对象    print 'seeking "%s"-->' % if (

字符串正则匹配(递归/DP)

Wildcard-Matching &  Regular Expression Matching Wildcard-Matching中?匹配任意一个字符,*匹配任意长度字符串包括空字符串 方法一:记录*的位置,分别考虑*匹配空,匹配一个,匹配两个,三个... 1 bool isMatch(const char *s, const char *p) { 2 int sStar=-1,pStar=-1; 3 int i=0,j=0; 4 for(i=0;i<strlen(s);)//不考虑p字符

字符串正则匹配替换

re.sub的功能 re是regular expression的缩写,表示正则表达式:sub是substitude的缩写,表示替换 re.sub是正则表达式的函数,实现比普通字符串更强大的替换功能 sub(pattern,repl,string,count=0,flag=0) 1))pattern正则表达式的字符串 eg中r'\w+' 2))repl被替换的内容eg中'10' 3))string正则表达式匹配的内容eg中"xy 15 rt 3e,gep" 4))count:由于正则表达

[Python正则表达式] 字符串中xml标签的匹配

现在有一个需求,比如给定如下数据: 2009-2-12 9:22:2 #### valentine s day 2011 #### sex is good for you #### Making love pleasures life genuinely good say researchers does healthy sex life boost mood growing evidence boosts physical increasing longevity reducing risk

Python正则匹配字母大小写不敏感在读xml中的应用

需要解决的问题:要匹配字符串,字符串中字母的大小写不确定,如何匹配? 问题出现之前是使用字符串比较的方式,比如要匹配'abc',则用语句: 1 if s == 'abc':#s为需要匹配的字符串 2 print '匹配成功\n' 现在的问题是s可能是Abc.ABC等等,所以需要大小写不敏感的匹配,如果把需要匹配的模式的大小写进行罗列,那即使是三个字母的短模式也是很麻烦,查了一下,正则表达式re模块中有个参数flags=re.I,这样就可以大小写不敏感的匹配了,示例如下: 1 import re