一、概念

简单来说正则表达式是由一些普通字符(例如,a 到 z 之间的字母)和一些元字符组成,用来匹配和过滤一些字符串的一种逻辑公式。

二、正则表达式的一些基本规则

1、一些常用的元字符

  ^  :匹配行或者字符串的起始位置,有时还会匹配整个文档的起始位置。

  $  :匹配行或字符串的结尾。

 \d  :匹配数字字符。

 \D  :匹配一个非数字字符。

 \w :匹配字母,数字,下划线。

\W  :匹配任何非单词字符(也就是非字母、数字、下划线字符)。

 \s  :匹配任何不可见字符(包括空格、Tab等空白符) 。

 \S  :匹配任何可见字符。

  .   :匹配除了换行符以外的任何字符。

\n   :匹配一个换行符。

  *   :匹配前面的子表达式任意次(匹配0个或多个字符)。如,ab*能匹配“a”,也能匹配“ab”以及“abb”。*等价于{0,}。

 +   :匹配前面的子表达式一次或多次(大于等于1次)。如,“ab+”能匹配“ab”以及“abb”,但不能匹配“a”。+等价于{1,}。

 ?   :匹配前面的子表达式零次或一次。如,“ab(cd)?”可以匹配“ab”或“abcd”。?等价于{0,1}。

{n} : n是一个非负整数。匹配确定的n次。如,“b{2}”不能匹配“abc”中的“b”,但是能匹配“abbc”中的两个b。

{n,}: n是一个非负整数。至少匹配n次。如,“b{2,}”不能匹配“abc”中的“b”,但能匹配“abbbbbbc”中的所有b。“b{1,}”等价于“b+”。“b{0,}”则等价于“b*”。

{n,m} :m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。如,“b{1,3}”将匹配“abbbbbbc”中的前三个b为一组,后三个b为一组。“b{0,1}”等价于“b?”。

x|y  :匹配x或y。如,“a|bbc”能匹配“a”或“bbc”。“[ab]ccd”则匹配“accd”或“bccd”。

[xyz] :字符集合。匹配所包含的任意一个字符。如,“[abc]”可以匹配“abc”中的“a”或“sb”中的“b”。

[^xyz] :负值字符集合。匹配未包含的任意字符。如,“[^abc]”可以匹配“apple”中的“pple”任一字符。

[a-z] :字符范围。匹配指定范围内的任意字符。如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符;[0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线。

注:对于一些特殊字符需要表达原有符号需要先使字符"转义",即,将反斜杠字符\ 放在它们前面。如,要匹配 * 字符,则使用 \*。特殊字符有:$、( )、*、+、.、[ ]、?、\、^、{ }、|。

2、运算符优先级

正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。

相同优先级的从左到右进行运算,不同优先级的运算先高后低。下表从最高到最低说明了各种正则表达式运算符的优先级顺序:

运算符 描述
\ 转义符
(), (?:), (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \任何元字符、任何字符 定位点和序列(即:位置和顺序)
| 替换,"或"操作
字符具有高于替换运算符的优先级,使得"m|food"匹配"m"或"food"。若要匹配"mood"或"food",请使用括号创建子表达式,从而产生"(m|f)ood"。

三、Python中正则表达式使用的函数

Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。

1、re.match函数

re.match 从字符串的起始位置开始匹配,如果第一个就不匹配,则返回None。

re.match(pattern, string, flags=0)

pattern:匹配的正则表达式。

string : 要匹配的字符串。

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

如:

 #coding:utf-8
#!/usr/bin/python3
import re s1="abc"
s2=" asd"
a=re.match(r'[a-zA-Z\_][0-9a-zA-Z\_]*', s1)
b=re.match(r'[a-zA-Z\_][0-9a-zA-Z\_]*', s2)
print(a)
print(b) #运行结果
<_sre.SRE_Match object; span=(0, 3), match='abc'>
None

demo

2、re.search函数

re.search 扫描整个字符串并返回第一个成功的匹配,如果整个字符串都没有匹配的,则返回None。

re.search(pattern, string, flags=0)

pattern:匹配的正则表达式。

string : 要匹配的字符串。

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

如:

 #coding:utf-8
#!/usr/bin/python3
import re s1="gabc"
a1=re.match(r'[abc]', s1)
print(a1) s2="gabc"
a2=re.search(r'[abc]', s2)
print(a2) s3="get"
a3=re.search(r'[abc]', s3)
print(a3) #运行结果
None
<_sre.SRE_Match object; span=(1, 2), match='a'>
None
#match从第一个开始匹配,第一个不匹配就返回None,search全局匹配,直到没有匹配的才返回None。

demo

3、re.compile 函数

compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,让其它用来匹配的函数使用,如match、search函数使用。

compile(pattern, flags=0)

pattern:匹配的正则表达式。  

flags :标志位。

一般配合其他函数使用,如和match函数:

re.compile(pattern).match(string)

使用情况如:

#coding:utf-8
#!/usr/bin/python3
import re s='abcdf13s2j3'
a=re.compile(r'\d+').match(s)
print(a)
a=re.compile(r'\d+').search(s)
print(a)
a=re.compile(r'\d+').findall(s)
print(a) #运行结果
None
<_sre.SRE_Match object; span=(5, 7), match=''>
['', '', '']

demo

4、re.findall函数

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

findall(pattern, string, flags=0)           #单独使用
findall(self, string, pos=0, endpos=-1) #与compile函数一起使用

pattern:匹配的正则表达式。

string : 要匹配的字符串。

flags :标志位

pos : 可选参数,指定字符串的起始位置,默认为 0。

endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。

如:

 #coding:utf-8
#!/usr/bin/python3
import re s='abcdf12s2j3'
a=re.findall(r'\d+',s) #单独使用
print(a)
a=re.compile(r'\d+').findall(s) #与compile函数一起使用
print(a) #运行结果
['', '', '']
['', '', '']

demo

5、re.finditer函数

和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

finditer(pattern, string, flags=0)

pattern:匹配的正则表达式。

string : 要匹配的字符串。

flags :标志位

如:

 #coding:utf-8
#!/usr/bin/python3
import re a = re.finditer(r"\d+","ab57cdf13s2j3")
print(a)
for match in a:
print (match.group() ) #运行结果
<callable_iterator object at 0x00E434D0>
57
13
2
3

demo

6、group()与groups()函数

group()  :匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。

groups():返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

如:

 #coding:utf-8
#!/usr/bin/python3
import re a = re.search(r"(\D+)(\d+)(\D+)(\d+)(\D+)(\d+)","ab57cdf13s2j3")
if a:
print("a.group() : ", a.group())
print("a.group(1) : ", a.group(1))
print("a.group(2) : ", a.group(2))
print("a.group(6) : ", a.group(6))
print("a.groups() : ", a.groups())
else:
print ("Nothing found!!") #运行结果
a.group() : ab57cdf13s2
a.group(1) : ab
a.group(2) : 57
a.group(6) : 2
a.groups() : ('ab', '', 'cdf', '', 's', '')

demo

7、re.sub函数

用于替换字符串中的匹配项。

sub(pattern, repl, string, count=0, flags=0)

pattern : 匹配的正则表达式。

repl : 替换的字符串,也可为一个函数。

string : 要被查找替换的原始字符串。

count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

如:

 #coding:utf-8
#!/usr/bin/python3
import re s='abcdf13s2j3'
a=re.sub(r'\d+','-',s,1) #替换一个
print(a)
a=re.sub(r'\d+','-',s) #全部替换
print(a) #运行结果
abcdf-s2j3
abcdf-s-j-

demo

 

参考学习网址:

http://www.runoob.com/regexp/regexp-operator.html

http://www.runoob.com/python/python-reg-expressions.html

注:参考上面博文,根据自己理解整理一份,有些是直接把作者简介拷贝过来的。

简介Python正则表达式的更多相关文章

  1. Python 正则表达式模块 (re) 简介

    Python 的 re 模块(Regular Expression 正则表达式)提供各种正则表达式的匹配操作,和 Perl 脚本的正则表达式功能类似,使用这一内嵌于 Python 的语言工具,尽管不能 ...

  2. Python天天美味(15) - Python正则表达式操作指南(re使用)(转)

    http://www.cnblogs.com/coderzh/archive/2008/05/06/1185755.html 简介 Python 自1.5版本起增加了re 模块,它提供 Perl 风格 ...

  3. Python 正则表达式(字符)详解

    Python正则表达式 - 简介 ​    其实正则表达式这种技术,源于一个很简单的问题:  如何通过变成使得计算机具有在文本中检索某种模式的能力? ​     而正则表达式为通过编程实现高级的文本模 ...

  4. Python正则表达式操作指南

    摘要 本文是通过Python的 re 模块来使用正则表达式的一个入门教程,和库参考手册的对应章节相比,更为浅显易懂.循序渐进. 本文可以从 http://www.amk.ca/python/howto ...

  5. Python学习:13.Python正则表达式

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

  6. Python面试题之Python正则表达式re模块

    一.Python正则表达式re模块简介 正则表达式,是一门相对通用的语言.简单说就是:用一系列的规则语法,去匹配,查找,替换等操作字符串,以达到对应的目的:此套规则,就是所谓的正则表达式.各个语言都有 ...

  7. Python 正则表达式入门(中级篇)

    Python 正则表达式入门(中级篇) 初级篇链接:http://www.cnblogs.com/chuxiuhong/p/5885073.html 上一篇我们说在这一篇里,我们会介绍子表达式,向前向 ...

  8. Python正则表达式中的re.S

    title: Python正则表达式中的re.S date: 2014-12-21 09:55:54 categories: [Python] tags: [正则表达式,python] --- 在Py ...

  9. Python 正则表达式入门(初级篇)

    Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写. 转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达 ...

随机推荐

  1. (转)OpenFire源码学习之二十七:Smack源码解析

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43484199 Smack Smack是一个用于和XMPP服务器通信的类库,由此可以实现即 ...

  2. [nRF51822 AK II 教程]第一课,开发环境的配置及背景介绍【转】

    低功耗蓝牙4.0是全新的技术,并不向下兼容,也就是说它和蓝牙3.0.2.0什么的都不能通信的.另外,蓝牙4.0目前的规范只能做外设和主机(智能手机,电脑等)通讯,也就是说你想用一个单模的蓝牙4.0开发 ...

  3. asp.net core容器&mysql容器network互联 & docker compose方式编排启动多个容器

    文章简介 asp.net core webapi容器与Mysql容器互联(network方式) docker compose方式编排启动多个容器 asp.net core webapi容器与Mysql ...

  4. 2019杭电多校第一场hdu6579 Operation(线性基)

    Operation 题目传送门 解题思路 把右边的数尽量往高位放,构造线性基的时候同时记录其在原序列中的位置,在可以插入的时候如果那个位置上存在的数字的位置比新放入的要小,就把旧的往后挤.用这种发现构 ...

  5. FreeBSD_11-系统管理——{Part_1-xfce 桌面}

    一.首先安装 Xorg 安装 xorg pkg install xorg 清除旧文件(如果已前安装过 xorg) /etc/X11/xorg.conf /usr/local/etc/X11/xorg. ...

  6. 关于Visual Leak Detector的配置与使用 (测试vector 引起的内存泄漏问题)

    之前在做一个音频特征提取的批量处理程序,老是出现内存泄露问题,用Visual Leak Detector(VLD)工具做了下检测,检测出了一些问题,解决后还是会有问题.之后继续排查,因为我的代码中,大 ...

  7. 设置非阻塞的套接字Socket

    当使用socket()函数和WSASocket()函数创建套接字时,默认都是阻塞的.在创建套接字之后,通过调用ioctlsocket()函数,将该套接字设置为非阻塞模式.函数的第一个参数是套接字,第二 ...

  8. the blank final field factors may not have been initialized

    Q1: why we should initialize final field before completion of new instance? final means no changeabl ...

  9. jq容易混淆点

    jQuery链式编程: 原:把当前元素颜色修改为红色,其余兄弟颜色不变 $(this).css("color",'red') ; $(this).siblings().css(&q ...

  10. (Struts2学习系列一)MyEclipse创建第一个struts2项目

    点击MyEclipse菜单栏File按钮,点击new-->Web Project 输入Project name之后点击Finish 项目创建完成. 然后右键项目,点击MyEclipse--> ...