python笔记51-re正则匹配findall

前言

re是python的一个正则匹配库,可以使用正则表达式匹配出我们想要的内容

findall 使用

findall 看下源码介绍, 返回字符串中所有不重叠匹配项的列表。
findall匹配的时候,会把结果放到list返回,如果没有匹配到返回空list不会报错

  • pattern 匹配的正则表达式

  • string  待匹配的字符串

  • flags=0 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

def findall(pattern, string, flags=0):
"""Return a list of all non-overlapping matches in the string.

If one or more capturing groups are present in the pattern, return
a list of groups; this will be a list of tuples if the pattern
has more than one group.

Empty matches are included in the result."""
return _compile(pattern, flags).findall(string)

3种使用形式

import re

kk = re.compile(r'\d+') # 匹配数字
res1 = kk.findall('one1two2three3four4')
print(res1)
# ['1', '2', '3', '4']

# 注意此处findall()的用法,可传两个参数;
kk = re.compile(r'\d+')
res2 = re.findall(kk,"one123two2")
print(res2)
# ['123', '2']

# 也可以直接在findall传2个参数
res3 = re.findall(r'\d+', "one123two2")
print(res3)
# ['123', '2']

findall 示例

匹配多个满足条件的结果,找出字符串中有多少个ab, 两个字符挨着的

a = "abcaabffabbcdaccbfabbbgggaaabbbkk"
# 1.找出字符串中有多少个ab, 两个字符挨着
res1 = re.findall(r"ab", a)
print(res1)
# ['ab', 'ab', 'ab', 'ab', 'ab']

继续查找如ab, aab, aaab,aaaab这种,a可以重复,也就是匹配前面的a是1个或多个

+是代表前面的字符出现1次或多次

import re

a = "abcaabffabbcdaccbfabbbgggaaabbbkk"
# 2.+是代表前面的字符出现1次或多次
res1 = re.findall(r"a+b", a)
print(res1)
# ['ab', 'aab', 'ab', 'ab', 'aaab']

*是代表匹配前面的字符出现0次或多次

import re

a = "abcaabffabbcdaccbfabbbgggaaabbbkk"
# 3.*代表前面的字符出现0次或多次
res1 = re.findall(r"a*b", a)
print(res1)
# ['ab', 'aab', 'ab', 'b', 'b', 'ab', 'b', 'b', 'aaab', 'b', 'b']

我们要匹配a和b之间有一个字符的,比如aab,abb,acb,adb都符合

.就是匹配除 \n (换行符)以外的任意一个字符

import re

a = "abcaabffabbcdaccbfabbbgggaaabbbkk"
# .就是匹配除 \n (换行符)以外的任意一个字符
res1 = re.findall(r"a.b", a)
print(res1)
# ['aab', 'abb', 'abb', 'aab']

贪婪 与 非贪婪

接着继续查找a和b之间,可以有字符如axb,axxxb,axxxxb ,其中x是任意字符,x也可以没有字符如ab。
但中间不能包含b,遇到b立马结束,如abcaab这种不符合,遇到第一个b就结束匹配

符号. 贪婪,匹配从.前面为开始到后面为结束的所有内容

import re

a = "abcaabffabbcdaccbfabbbgggaaabbbkk"
# 符号.* 贪婪,匹配从.*前面为开始到后面为结束的所有内容
res1 = re.findall(r"a.*b", a)
print(res1)
# ['abcaabffabbcdaccbfabbbgggaaabbb']

符号.*? 非贪婪,遇到开始和结束就进行截取,因此截取多次符合的结果,中间没有字符也会被截取

import re

a = "abcaabffabbcdaccbfabbbgggaaabbbkk"
# 符号.*? 非贪婪,遇到开始和结束就进行截取
res1 = re.findall(r"a.*?b", a)
print(res1)

# ['ab', 'aab', 'ab', 'accb', 'ab', 'aaab']

()的使用

比如我要从下面这段文本中取出我的博客地址, 上面学到的.*?是非贪婪匹配,可以匹配出我们想要的内容

import re

a = "作者-上海悠悠 QQ交流群:717225969 blog地址:https://www.cnblogs.com/yoyoketang/ 欢迎收藏"
res1 = re.findall(r'blog地址:.*? 欢迎收藏', a)
print(res1)
# ['blog地址:https://www.cnblogs.com/yoyoketang/ 欢迎收藏']

如果不加括号,它会把匹配的一整串全部取出来,其实我们只想要中间的那段内容,于是可以用(.*?)

import re

a = "作者-上海悠悠 QQ交流群:717225969 blog地址:https://www.cnblogs.com/yoyoketang/ 欢迎收藏"
res1 = re.findall(r'blog地址:(.*?) 欢迎收藏', a)
print(res1)
# ['https://www.cnblogs.com/yoyoketang/']

re.S匹配换行

前面匹配都是一整串没有换行的情况,如果我们需要匹配的内容,中间刚好有换行了,那就匹配不到了。
.就是匹配除 \n (换行符)以外的任意一个字符,这里是不包含换行的

import re

a = '''作者-上海悠悠 QQ交流群:717225969 blog地址:https:
//www.cnblogs.com/yoyoketang/ 欢迎收藏
'''
# 中间有换行的时候匹配
res1 = re.findall(r'blog地址:(.*?) 欢迎收藏', a)
print(res1)

# []

前面介绍findall源码的时候还有个flags参数,这个时候就可以派上用处了,加上flags=re.S参数,忽略换行符

import re

a = '''作者-上海悠悠 QQ交流群:717225969 blog地址:https:
//www.cnblogs.com/yoyoketang/ 欢迎收藏
'''
# 中间有换行的时候匹配
res1 = re.findall(r'blog地址:(.*?) 欢迎收藏', a, flags=re.S)
print(res1)
# ['https:\n//www.cnblogs.com/yoyoketang/']

正则表达式修饰符

正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。

修饰符 描述
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志

2021年第六期《python接口自动化+测试开发》课程,1月9号开学(火热报名中!)

本期上课时间:1月9号-4月18号,每周六、周日晚上20:30-22:30

(0)

相关推荐

  • 学习python 正则表达式——与你同行!

    正则表达式定义   又称为规则表达式,是一个特殊的字符序列,利用事先定义好的一些特定字符以及它们的组合组成一个'规则',检查一个字符串是否与这种规则匹配来实现对字符的检索.过滤.匹配.替换.正则表达式 ...

  • python笔记52-re正则匹配search

    前言 re.search扫描整个字符串并返回第一个成功的匹配.re.findall返回字符串中所有不重叠匹配项的列表,如果没有匹配到返回空list不会报错. search匹配对象有3个方法:group ...

  • python笔记54-re正则匹配替换字符串(sub和subn)

    前言 python 里面可以用 replace 实现简单的替换字符串操作,如果要实现复杂一点的替换字符串操作,需用到正则表达式. re.sub用于替换字符串中匹配项,返回一个替换后的字符串,subn方 ...

  • python笔记56-re正则匹配re.match

    前言 re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none. re.search 扫描整个字符串并返回第一个成功的匹配. re.match ...

  • 完整版Python笔记|超级有用

    完整版Python笔记|超级有用

  • 【python笔记】python java 语法,对比学习

    【python笔记】python java 语法,对比学习

  • python笔记2-冒泡排序

    前言 面试的时候经常有面试官喜欢问如何进行冒泡排序?这个问题相信能难倒一批英雄好汉,本篇就详细讲解如何用python进行冒泡排序. 一.基本原理 1.概念: 冒泡排序(Bubble Sort),是一种 ...

  • python笔记3-发送邮件(smtplib)

    前言 本篇总结了QQ邮箱和163邮箱发送邮件,邮件包含html中文和附件,可以发给多个收件人,专治各种不行,总之看完这篇麻麻再也不用担心我的邮件收不到了. 以下代码兼容python2和python3, ...

  • python笔记4-遍历文件夹目录os.walk()

    前言 如何遍历查找出某个文件夹内所有的子文件呢?并且找出某个后缀的所有文件 一.walk功能简介 1.os.walk() 方法用于通过在目录树种游走输出在目录中的文件名,向上或者向下. 2.walk( ...

  • python笔记5-python2写csv文件中文乱码问题

    前言 python2最大的坑在于中文编码问题,遇到中文报错首先加u,再各种encode.decode. 当list.tuple.dict里面有中文时,打印出来的是Unicode编码,这个是无解的. 对 ...