1、re.findall()函数

语法:re.findall(pattern,string,flags=0) ——> list(列表)

列出字符串中模式的所有匹配项,并作为一个列表返回。如果无匹配,则返回空列表!

与re.search()不一样的地方:

  • re.findall返回的是列表,re.search返回文本
  • re.findall匹配多个值,re.search只要匹配到就返回,只匹配一个值
>>> import re
>>> re.findall(r"ab","abcaaaab")
['ab', 'ab'] #匹配的值作为一个列表范围

2、re.compile()函数

语法:re.compile(pattern,flags=0) ——> pattern object

根据包含正则表达式的字符串创建模式对象,可以实现更有效率地匹配!用了re.compile以后,正则对象会得到保留,这样在需要多次运用这个正则对象的时候,效率会有较大的提升

此外,re.cpmpile() 可以通过接受可选的属性,常用来实现不同的特殊功能和语法变更。

2.1 例1:使用re.compile(pattern)对正则表达式进行编译

>>> import re
>>> s=r"^010-\d{8}$"
>>> re.findall(s,"010-12345678")
['010-12345678']
>>> p_tel=re.compile(s) #对s这个正则表达式创建模式对象p_tel
>>> p_tel
<_sre.SRE_Pattern object at 0x7f3ab3776d78>
>>> p_tel.findall("010-12345678") #经过compile转换的正则表达式对象也能用于普通的re函数,跟上面的re.findall(s,"010-12345678")一样的效果
['010-12345678']

2.2 使用re.compile(pattern)进行编译,不区分大小写

>>> import re
>>> s=r"hello"
>>> greeting=re.compile(s,re.I) #re.I 属性让正则表达式忽略大小写!
>>> greeting.findall("HELLO")
['HELLO']
>>> greeting.findall("hello")
['hello']
>>> greeting.findall("hEllo")
['hEllo']

2.3 为什么正则匹配模式前面加 "r"

禁止转义!反斜杠不会被任何特殊方式处理。

Python编译器用‘\’(反斜杠)来表示字符串常量中的转义字符。

如果反斜杠后面跟着一串编译器能够识别的特殊字符,那么整个转义序列将被替换成对应的特殊字符(例如,‘\n’将被编译器替换成换行符)

本质上来讲,使用r,你在告诉编译器完全不要去干涉你的字符串

例如:

>>> string='this is a\nnormal string'
>>> print string
this is a
normal string #不使用r,\n在字符串中代表一个换行符
>>> rawstring=r'this is a\nnormal string'
>>> print rawstring
this is a\nnormal string #使用r,\n在字符串中就是\n

3、re.match()函数

语法:re.match(pattern, string, flags=0) ——> match object or None

在字符串的开始位置匹配正则!如果无匹配,则返回 None 。

>>> import re
>>> s=r"abc"
>>> com=re.compile(s)
>>> com.match("abcdef") #abc在开始的位置,可以匹配
<_sre.SRE_Match object at 0x7f3ab3480cc8>
>>> print com.match("hhhabc") #abc不在开始的位置,不可以匹配
None

3.1 使用group()-返回匹配的数据

>>> import re
>>> s=r"abc"
>>> com=re.compile(s)
>>> com.match("abcddddd").group() #使用group()返回匹配的对象
'abc'

4、re.search()函数

语法:re.search(pattern, string, flags=0) ——> match object or None

re.search函数会在字符串内查找模式匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回None

re.match与re.search的区别:re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

>>> import re
>>> s=r"abc"
>>> com=re.compile(s)
>>> com.search("abcdef")
<_sre.SRE_Match object at 0x7f3ab3480cc8>
>>> com.search("hhhabc")
<_sre.SRE_Match object at 0x7f3ab3480d30> #与re.match的区别:无论在哪个位置都能匹配

4.1 使用group()-返回匹配的数据

>>> import re
>>> s=r"abc"
>>> com=re.compile(s)
>>> com.search("abcddd").group() #使用group()返回匹配的对象
'abc'
>>> com.search("abcdddabc").group() #只匹配一个
'abc'

4.2 关于group更多

返回匹配到的一个或者多个子组。如果是一个参数,那么结果就是一个字符串,如果是多个参数,那么结果就是一个参数一个item的元组。

group1的默认值为0(将返回所有的匹配值).如果groupN参数为0,相对应的返回值就是全部匹配的字符串,

如果group1的值是[1…99]范围之内的,那么将匹配对应括号组的字符串。如果组号是负的或者比pattern中定义的组号大,那么将抛出IndexError异常。如果pattern没有匹配到,但是group匹配到了,那么group的值也为None。如果一个pattern可以匹配多个,那么组对应的是样式匹配的最后一个。另外,子组是根据括号从左向右来进行区分的。

>>> s=r"(\w+) (\w+)"
>>> com=re.compile(s)
>>> m=com.search("abc def,222")
>>> m.group() #返回所有的匹配值
'abc def'
>>> m.group(0) #返回所有的匹配值,默认是0
'abc def'
>>> m.group(1) #如果group的值是[1…99]范围之内的,那么将匹配对应括号组的字符串
'abc'
>>> m.group(2)
'def'
>>> m.group(1,2) #如果是一个参数,那么结果就是一个字符串,如果是多个参数,那么结果就是一个参数一个item的元组
('abc', 'def')
>>> m.group(3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: no such group #如果组号是负的或者比pattern中定义的组号大,那么将抛出IndexError异常

还可以把使用别的变量值来代替默认的group(N)中的N,如下写法:

>>> import re
>>> m=re.search(r"(?P<one>\w+) (?P<two>\w+)","abc def,222") #?P<变量值>写法
>>> m.group("one")
'abc'
>>> m.group("two")
'def'

4.3 关于MatchObject(匹配对象) 方法

re.match和re.search都是返回MatchObject,有如下方法

  • group(): 返回被正则匹配的字符串;
  • start(): 返回匹配开始的位置;
  • end(): 返回匹配结束的位置;
  • span(): 返回一个元组包含匹配(开始,结束)的位置。

5、re.finditer()函数

语法:re.finditer(pattern,string,flags=0) ——> iterator

列出字符串中模式的所有匹配项,并作为一个迭代器返回。

延伸下,什么是iterator?转载:https://www.liaoxuefeng.com

  • 凡是可作用于for循环的对象都是Iterable类型;
  • 凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
  • 集合数据类型如listdictstr等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

Python的for循环本质上就是通过不断调用next()函数实现的,例如:

for x in [1, 2, 3, 4, 5]:
pass

实际上完全等价于:

# 首先获得Iterator对象:
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
try:
# 获得下一个值:
x = next(it)
except StopIteration:
# 遇到StopIteration就退出循环
break

言归正传,举例如下:

>>> import re
>>> s=r"\d+"
>>> com=re.compile(s)
>>> com.finditer("aa11bb22cc")
<callable-iterator object at 0x7f3ab3499cd0>
>>> it=com.finditer("aa11bb22cc")
>>> for i in it:
... print i #返回一个match对象
... print i.group() #返回匹配的数据
...
<_sre.SRE_Match object at 0x7f3ab3480d30>
11
<_sre.SRE_Match object at 0x7f3ab3480cc8>
22

6、re.sub()函数

语法:re.sub(pattern, repl, string, count=0, flags=0) ——> string

将字符串中所有 pattern 的匹配项用 repl 替换!

>>> import re
>>> re.sub(r"abc","123","abcdefabc")
'123def123'

7、re.subn()函数

语法:re.subn(pattern, repl, string, count=0, flags=0)

与sub()实现相同的替换作用,但是subn()返回一个元组,其中包含新字符串和替换次数!

>>> import re
>>> re.subn(r"abc","123","abcdefabc")
('123def123', 2)

8、re.split()函数

语法:re.split(pattern, string, maxsplit=0, flags=0) ——> list

根据模式的匹配项来分割字符串!

>>> import re
>>> re.split(r"\d+","aa11bb22cc") #以正则表达式\d+为分割符
['aa', 'bb', 'cc']
>>> re.split(r"\d","aa11bb22cc") #以正则表达式\d+为分割符
['aa', '', 'bb', '', 'cc']

python笔记-正则表达式常用函数的更多相关文章

  1. 【python】正则表达式-常用函数

    m = re.search(pattern, string) # 搜索整个字符串,直到发现符合的子字符串. m = re.match(pattern, string) # 从头开始检查字符串是否符合正 ...

  2. Python学习笔记之常用函数及说明

    Python学习笔记之常用函数及说明 俗话说"好记性不如烂笔头",老祖宗们几千年总结出来的东西还是有些道理的,所以,常用的东西也要记下来,不记不知道,一记吓一跳,乖乖,函数咋这么多 ...

  3. python笔记之常用模块用法分析

    python笔记之常用模块用法分析 内置模块(不用import就可以直接使用) 常用内置函数 help(obj) 在线帮助, obj可是任何类型 callable(obj) 查看一个obj是不是可以像 ...

  4. (四) tensorflow笔记:常用函数说明

    tensorflow笔记系列: (一) tensorflow笔记:流程,概念和简单代码注释 (二) tensorflow笔记:多层CNN代码分析 (三) tensorflow笔记:多层LSTM代码分析 ...

  5. opencv-学习笔记(1)常用函数和方法。

    opencv-学习笔记(1)常用函数和方法. cv2.imread(filename,falg) filename是文件名字 flag是读入的方式 cv2.MREAD_UNCHANGED :不进行转化 ...

  6. numpy学习笔记 - numpy常用函数、向量化操作及基本数学统计方法

    # -*- coding: utf-8 -*-"""主要记录代码,相关说明采用注释形势,供日常总结.查阅使用,不定时更新.Created on Fri Aug 24 19 ...

  7. Python 数据类型,常用函数方法分类

    Python基本数据类型:(int) 字符串(str)列表(list)元组(tuple)字典(dict)布尔(bool) python中可以简单使用 类型(数据)创建或转换数据 例: #字符串转数字 ...

  8. PHP 正则表达式常用函数使用小结

    在PHP中有两套正则表达式函数库.一套是由PCRE(Perl Compatible Regular Expression)库提供的.PCRE库使用和Perl相同的语法规则实现了正则表达式的模式匹配,其 ...

  9. Python math库常用函数

    math库常用函数及举例: 注意:使用math库前,用import导入该库>>> import math 取大于等于x的最小的整数值,如果x是一个整数,则返回x>>> ...

随机推荐

  1. [转]客户端js判断文件类型和文件大小即限制上传大小

    原文地址:https://www.jb51.net/article/43498.htm 需要脚本在客户端判断大小和文件类型,由于网上没有适合的,就自己写了一个并测试 文件上传大小限制的一个例子,在此与 ...

  2. Build GMP on 64bit Windows

    1.MSYS2 环境搭建 1.1.安装 msys2 的主页地址: http://www.msys2.org/ 下载32位或64位,我这里 下载了64位 msys2-x86_64-20161025.ex ...

  3. [JVM] IDEA集成VisualVM

    VisualVM是集成命令行JDK工具和轻量级分析功能的可视化工具. 参考: https://blog.csdn.net/qq_22741461/article/details/80451675 ht ...

  4. go for-range中的循环变量

    测试的时候发现一个有意思的地方,就是go始终利用同一块内存来接收集合中的一个值,只是在每次循环的时候重新赋值而已. package main import (     "fmt" ...

  5. DB2隔离级别之RR/RS/CS/UR

      1.RR隔离级别:在此隔离级别下. DB2会锁住全部相关的纪录. 在一个SQL语句运行期间, 全部运行此语句扫描过的纪录都会被加上对应的锁.在一个SQL语句运行期间,全部运行此语句扫描过的纪录都会 ...

  6. Dart

    Dart异步与阻塞 import 'dart:async'; import 'dart:io'; void main() async { for(int i = 0;i<10;i++) { as ...

  7. ubuntu使任何地方右键都能打开terminal

    ubuntu下安装terminal,在任何地方右键都可以快速的打开termial sudo apt-get install nautilus-open-terminal 重启电脑

  8. 微信的NATIVE支付提示201商户订单号重复的解决方案

    无论采取模式一还是模式二,进行预支付ID获取的时候应当确保订单号的唯一性,否则就会造成第二次扫码后的重复提醒. 解决方案: 以预支付ID处理为例: 商城: 1.创建log_id数据表如:out_tra ...

  9. VS2017 配置QT5

    QT安装 1. QT下载 2. 安装过程中,组件的选择(图自https://blog.csdn.net/gaojixu/article/details/82185694) 3. 安装完成 VS2017 ...

  10. Hystrix入门与分析(二):依赖隔离之线程池隔离

    1.依赖隔离概述 依赖隔离是Hystrix的核心目的.依赖隔离其实就是资源隔离,把对依赖使用的资源隔离起来,统一控制和调度.那为什么需要把资源隔离起来呢?主要有以下几点: 1.合理分配资源,把给资源分 ...