import re
# match findall经常用
# re.match() #从开头匹配,没有匹配到对象就返回NONE
# re.search() #浏览全部字符,匹配第一个符合规则的字符串
# re.findall() # 将匹配到的所有内容都放置在一个列表中

一 match 

# match 的两种情况

#无分组

 r = re.match("h\w+",origin)
print(r.group()) # 获取匹配所有结果 hello
print(r.groups()) #获取模型中匹配到的分组 ()
print(r.groupdict()) #获取模型中匹配到的分组 {}

#有分组(带有括号的就是有分组)

取匹配到的正则再次取其部分内容,括号中的。

 origin = "hello alex sadf dsaf"
r = re.match("(h)\w+",origin)
print(r.group()) # hello 获取匹配所有结果
print(r.groups()) #('h',) #获取模型中匹配到的分组结果,放到元组里,就是括号中的 没有分组则为空元组,
r = re.match("(?P<n1>h)(?P<n2>\w+)",origin) #获取模型中匹配到的分组中所有执行力key的组 ?P<KEY>VALUE {'n2': 'ello', 'n1': 'h'}
print(r.groupdict()) #?P<KEY>VALUE {'n2': 'ello', 'n1': 'h'}

二 groups group  groupdict

 print(r.group())  # hello  获取匹配所有结果
print(r.groups()) #('h',) #获取模型中匹配到的分组,放到元组里,没有分组则为空元组
r = re.match("(?P<n1>h)(?P<n2>\w+)",origin) #获取模型中匹配到的分组中所有执行力key的组 ?P<KEY>VALUE {'n2': 'ello', 'n1': 'h'}
print(r.groupdict()) #?P<KEY>VALUE {'n2': 'ello', 'n1': 'h'}

三 search 

# search 的两种情况

search 不用从开头匹配,而是匹配全局整个字符串,一旦又符合就退出

# 无分组

 origin = "hello alex alix bcd dsfa lefg abc 199"
r = re.search("ali\w+",origin)
print(r.group()) #alix
print(r.groups()) #()
print(r.groupdict()) #{}

# 有分组

 origin = "hello alex alix bcd dsfa lefg abc 199"
r = re.search("a(\w+)",origin)
print(r.group()) #alex
print(r.groups()) #('lex',)
r = re.search("(?P<key1>a)(?P<key2>(\w+))",origin)
print(r.groupdict()) #{'key1': 'a', 'key2': 'lex'}

四 findall

# 1 匹配到之后,就抽离,继续从下一个字符,依次匹配。

 origin = "a2b3c4d5"
a=re.findall("\d+\w\d+",origin) #['2b3', '4d5']
print(a)

# 2 空值也会挨个字符去匹配,结尾后,还要继续多匹配一次

 num = "asd"
print(re.findall("",num)) # ['', '', '', '']

# 无分组

 origin = "hello alex alix bcd dsfa lefg abc 199"
print(re.findall("a\w+",origin)) # ['alex', 'alix', 'abc']
print(re.findall("(a\w+)",origin)) #['alex', 'alix', 'abc'] 匹配到什么值就是什么值,分组无意义。
print(re.findall("a(\w+)",origin)) #组 groups ['lex', 'lix', 'bc'] 在匹配的值里面做了分组。把groups里的内容放到列表里,只拿组里面的东西
print(re.findall("(a)(\w+)(x)",origin)) # [('a', 'le', 'x'), ('a', 'li', 'x')] 将 三个分组匹配到的做成元组 放到列表作为一个元素

findall 特点

 分组匹配
* 贪婪匹配: 比如如下的asd 为一个分组,而一旦遇到asd开始的字符串,如果
后面还是asd也会匹配,这就是贪婪匹配。
findall 特性:
1 有几个分组返回几个内容:,并将返回内容放到元组内 作为列表的一个元素。
2 即尽管* 匹配到了两个asd ,但是因为是贪婪虚拟匹配出的,有一个分组,所以,
只会,取一个。
3 而findall默认只取最后一组匹配的内容,按照真实的括号数量。故此 只返回最后一组asd
4 findall 如果正则能有空的匹配的话,那么匹配字符串最后还会匹配到一个空
5 多个分组匹配到做成元组,当成列表的一个元素
6 多个分组,查找顺序,外到内,左到右 ((\w)(\w)){2,} 先是找到2个字母的,再在这两个字母里面进行局部分组
#1 特性1 2 3 4
print(re.findall(r'(asd)*','asdasd'))  #['asd', '']
#2 如下,默认+可以第一次 就匹配到 1asd2asd 但由于前面只有1个分组,只能返回后面的4位了
n = re.findall("(\dasd)+","1asd2asdp2asds") # ['2asd', '2asd']
print(n)
#3 如下,默认*可以第一次 就匹配到 1asd2asd 但由于前面只有1个分组,只能返回后面的4位了
  #但是*还可以表示0次,故再遇到p的时候,空就能匹配了,而且,最后还有个s也匹配到空,结尾还默认还会匹配到空
n = re.findall("(\dasd)*","1asd2asdp2asds") # ['2asd', '', '2asd', '', '']
print(n)
 #4 匹配,最多四个字母,因此alex都找到了,但是只有一个分组,所以只返回最后一个\w故x
a = "alex"
n = re.findall("(\w){4}",a)
print(n) # ['x']

  #5 这里findall 匹配分组是一个字母匹配到了,而*是贪婪匹配,四个字母都匹配就取到了四个字母,而正则分组只有一个,因此只取最后一个

 a = "alex"
n = re.findall("(\w)*",a)
print(n) # ['x', '']
#6  由于从外到内, 所以匹配两个字母的 al 匹配到了,ex也匹配到了,外部分组1个,因此ex,而内部从左到右又会匹配。
a = "alex"
n = re.findall("((\w)(\w)){2,}",a)
print(n) # [('ex', 'e', 'x')]
#7  会匹配ax alex alex acd 但是贪婪匹配的分组只有 1个 因此 ax ax ax ad
origin = "hello ax lex bed alex lge alex acd 19"
n = re.findall("(a)(\w)*" , origin)
print(n) #[('a', 'x'), ('a', 'x'), ('a', 'x'), ('a', 'd')]
#1 特性1 2 3 4
1
print(re.findall(r'(asd)*','asdasd'))  #['asd', '']
#2 如下,默认+可以第一次 就匹配到 1asd2asd 但由于前面只有1个分组,只能返回后面的4位了
1
2
= re.findall("(\dasd)+","1asd2asdp2asds"# ['2asd', '2asd']
print(n)

 

#3 如下,默认*可以第一次 就匹配到 1asd2asd 但由于前面只有1个分组,只能返回后面的4位了
  #但是*还可以表示0次,故再遇到p的时候,空就能匹配了,而且,最后还有个s也匹配到空,结尾还默认还会匹配到空

 

1
2
= re.findall("(\dasd)*","1asd2asdp2asds"# ['2asd', '', '2asd', '', '']
print(n)

 

#4 匹配,最多四个字母,因此alex都找到了,但是只有一个分组,所以只返回最后一个\w故x
1
2
3
= "alex"
= re.findall("(\w){4}",a)
print(n)  # ['x']

 

#5  这里findall 匹配分组是一个字母匹配到了,而*是贪婪匹配,四个字母都匹配就取到了四个字母,而正则分组只有一个,因此只取最后一个

 

1
2
3
= "alex"
= re.findall("(\w)*",a)
print(n)  # ['x', '']

 

#6  由于从外到内, 所以匹配两个字母的 al 匹配到了,ex也匹配到了,外部分组1个,因此ex,而内部从左到右又会匹配。

 

1
2
3
= "alex"
= re.findall("((\w)(\w)){2,}",a)
print(n)  # [('ex', 'e', 'x')]

 

#7  会匹配ax alex alex acd 但是贪婪匹配的分组只有 1个 因此 ax ax ax ad
1
2
3
origin = "hello ax lex bed alex lge alex acd 19"
= re.findall("(a)(\w)*" , origin)
print(n)  #[('a', 'x'), ('a', 'x'), ('a', 'x'), ('a', 'd')]

python基础-6.1 match search findall group(s) 区别的更多相关文章

  1. python正则之match search findall

    match:只匹配一次,开头匹配不上,则不继续匹配 a,b,\w+ match(a,"abcdef") 匹配a >>> re.match("a" ...

  2. python 基础 8.3 match方法和search方法

    一,正则对象的split 方法 split(string[,maxsplit]) 按照能够匹配的字串讲string 分割后返回列表.maxsplit 用于指定最大分割次数,不指定将全部分割.来查找符合 ...

  3. python基础之小数据池,is和==区别 编码问题

    主要内容 小数据池,is和==区别 编码问题 小数据池 一种缓存机制,也称为驻留机制,是为了能更快提高一些字符串和整数的处理速度is 和 == 的区别 == 主要指对变量值是否相等的判断,只要数值相同 ...

  4. python基础===进程,线程,协程的区别(转)

    本文转自:http://blog.csdn.net/hairetz/article/details/16119911 进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度. 线程拥有自 ...

  5. python基础教程:dir()和__dict__属性的区别

    只要是有属性的数据对象(不一定是面向对象的对象实例,而是指具有数据类型的数据对象),都可以通过- ---- __dict__和dir()来显示数据对象的相关属性. __ dict__可以看作是数据对象 ...

  6. Python基础-week05

    本节大纲:Author:http://www.cnblogs.com/Jame-mei 模块介绍 time & datetime模块 random os sys shutil json &am ...

  7. Python基础篇【第3篇】: Python正则表达式

    正则表达式 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大.正则表达式是一个特殊的 ...

  8. 1.22 Python基础知识 - 正则表达式

    Python正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. re ...

  9. Python中re的match、search、findall、finditer区别

    原文地址: http://blog.csdn.net/djskl/article/details/44357389 这四个方法是从某个字符串中寻找特定子串或判断某个字符串是否符合某个模式的常用方法. ...

随机推荐

  1. CentOS7 编译安装python3.6.8(升级python)

    1.安装依赖包和需要用到的工具 yum -y install wget openssl openssl-devel 这里如果不升级openssl,安装后pip安装模块可能会出错.点我查看pip安装模块 ...

  2. PAT Advanced 1036 Boys vs Girls (25 分)

    This time you are asked to tell the difference between the lowest grade of all the male students and ...

  3. win10文件夹共享

    1.开启server服务就可以使用net share 命令 2.查看目前已共享的文件夹 3.关闭默认共享 只有用administrator(且有密码)才能连上win10上的默认共享了,只有admini ...

  4. Codeforces 916 二进制1数目构造(阅读理解) 最小生成树1-N路径质数构造

    A #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #def ...

  5. Vue获取dom元素

     <li  @click='获取li标签'    :ref="center-li" id="center-li"      > =====我是li标 ...

  6. 【ARC101F】Robots and Exits 树状数组优化DP

    ARC101F Robots and Exits 树状数组 有 $ n $ 个机器人和 $ m $ 个出口.这 $ n $ 个机器人的初始位置是 $ a_1,a_2.....a_n $ ,这 $ m ...

  7. java:集合输出之foreach输出三

    java:集合输出之foreach输出三 foreach输出: List<String> allList = new ArrayList<String>(); allList. ...

  8. 一本通【例题4】Addition Chains——题解

    又是一道剪枝剪了半天的搜索题...题目传送 要充分利用题目中的约束条件:1.:2.对于每个k(1≤k≤m)k(1≤k≤m)满足ak=ai+aj(0≤i,j≤k−1)ak=ai+aj(0≤i,j≤k−1 ...

  9. SQL 多表查询的几种连接方式

    --创建数据库 create database GoodsSystem go --使用数据库 use GoodsSystem go --创建商品类型表 create table GoodsType ( ...

  10. andriod\iphone视频禁止全屏播放

    x-webkit-airplay="true" x5-playsinline="true" webkit-playsinline="true" ...