Python学习(二) 正则表达式

Python正则表达式

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。re 模块使 Python 语言拥有全部的正则表达式功能。re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。本文主要讲解一些正则表达式的实例,以及一些常用的函数。

  • re.match函数
  • re.search方法
  • re.match与re.search的区别
  • 检索和替换
  • 正则表达式模式
  • 正则表达式实例

re.match函数

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。。函数语法:

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

函数参数说明: pattern:匹配的正则表达式 string: 要匹配的字符串 flags:标志位,用于控制正则表达式的匹配方式

废话不多说,直接一个实例搞定这个函数。如下:

#!/usr/bin/python
import re

line = "Cats are smarter than dogs"

matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)

if matchObj:
   print "matchObj.group() : ", matchObj.group()
   print "matchObj.group(1) : ", matchObj.group(1)
   print "matchObj.group(2) : ", matchObj.group(2)
else:
   print "No match!!"

执行结果自己在python交互环境下跑一下。主要来说明这个函数的用法以及正则表达式的意思。 re.match( r’(.) are (.?) .*’, line,re.M|re.I)

针对上述正则表达式的解释:

首先括号表示group,从表达式左边开始每遇到一个分组的左括号,编号+1. 其次re.M|re.I,中|代表左右表达式任意匹配一个。 然后就是pattern部分第一个括号(.*),其中.表示匹配任意除换行符外的符号 ?匹配前一个字符0次或者1次

re.search方法

re.search 扫描整个字符串并返回第一个成功的匹配。 函数语法同match一样。 直接上例子:

import re
print(re.search('www', 'www.runoob.com').span())  # 在起始位置匹配
print(re.search('com', 'www.runoob.com').span())         # 不在起始位置匹配

以上运行结果

(0, 3)
(11, 14)

自己可以把re.search换成re.match函数试试,看看结果有什么不同

re.match与re.search的区别

re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。(尝试上面的例子,就应该明白这两者的区别)

检索和替换

Python 的re模块提供了re.sub用于替换字符串中的匹配项。 语法:

re.sub(pattern, repl, string, max=0)

返回的字符串是在字符串中用 RE 最左边不重复的匹配来替换。如果模式没有发现,字符将被没有改变地返回。 可选参数 count 是模式匹配后替换的最大次数;count 必须是非负整数。缺省值是 0 表示替换所有的匹配。 直接上例子:

#!/usr/bin/python
import re

phone = "315-386-123 # This is Phone Number"

# Delete Python-style comments
num = re.sub(r'#.*$', "", phone)
print "Phone Num : ", num

# Remove anything other than digits
num = re.sub(r'\D', "", phone)    
print "Phone Num : ", num

以上实例执行结果如下:

Phone Num :  315-386-123
Phone Num :  315386123

num = re.sub(r’#.*′,“”,phone)’, “”, phone) 匹配字符串末尾,在多行模式中匹配每一行的末尾 ‘#.*$’的意思是从#开始到字符串末尾的所有内容,全部用空格替换。 num = re.sub(r’\D’, “”, phone) \D表示非数字 \d表示数字[0-9] 则上述表达式意思是首选匹配非数字的内容,然后用空来替换。

正则表达式模式

模式字符串使用特殊的语法来表示一个正则表达式: 字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。 多数字母和数字前加一个反斜杠时会拥有不同的含义。 标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。 反斜杠本身需要使用反斜杠转义。 由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如 r’/t’,等价于’//t’)匹配相应的特殊字符。 下表列出了正则表达式模式语法中的特殊元素。如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。

模式 描述 ^ 匹配字符串的开头 $ 匹配字符串的末尾。 . 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。 […] 用来表示一组字符,单独列出:[amk] 匹配 ‘a’,’m’或’k’ [^…] 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。 re* 匹配0个或多个的表达式。 re+ 匹配1个或多个的表达式。 re? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 re{ n} re{ n,} 精确匹配n个前面表达式。 re{ n, m} 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式 a| b 匹配a或b (re) G匹配括号内的表达式,也表示一个组 (?imx) 正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。 (?-imx) 正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。 (?: re) 类似 (…), 但是不表示一个组 (?imx: re) 在括号中使用i, m, 或 x 可选标志 (?-imx: re) 在括号中不使用i, m, 或 x 可选标志 (?#…) 注释. (?= re) 前向肯定界定符。如果所含正则表达式,以 … 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。 (?! re) 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功 (?> re) 匹配的独立模式,省去回溯。 \w 匹配字母数字 \W 匹配非字母数字 \s 匹配任意空白字符,等价于 [\t\n\r\f]. \S 匹配任意非空字符 \d 匹配任意数字,等价于 [0-9]. \D 匹配任意非数字 \A 匹配字符串开始 \Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。c \z 匹配字符串结束 \G 匹配最后匹配完成的位置。 \b 匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配”never” 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。 \B 匹配非单词边界。’er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。 \n, \t, 等. 匹配一个换行符。匹配一个制表符。等 \1…\9 匹配第n个分组的子表达式。 \10 匹配第n个分组的子表达式,如果它经匹配。否则指的是八进制字符码的表达式。

正则表达式实例

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Vamei实验室

Python进阶07 函数对象

秉承着一切皆对象的理念,我们再次回头来看函数(function)。函数也是一个对象,具有属性(可以使用dir()查询)。作为对象,它还可以赋值给其它对象名,或者...

2186
来自专栏java工会

完整的java数组操作应用知识汇总

数组是一种非常有用和常用的数据类型,存在于每种程序语言之中,java中的数组是一种最简单的复合数据类型,刚学习java数组的小白们大多都会听到一句这样的话:ja...

802
来自专栏C/C++基础

C++解引用运算符*重载

“*”是一个一元操作符,它作用于指针,获取指针所指单元的内容。当某个类中对*操作符重载时,是将该类对象当做一个指针看待,而用*操作符提取指针所指向的内容。考察如...

744
来自专栏企鹅号快讯

Python序列元素计数的方法,你知道几种?

在Python脚本语言中,数据结构有许多种,常见的数据类型有:序列,映射与集合三大类型,其中序列又分为可变序列和不可变序列,可变序列有2类:列表(List)与字...

19810
来自专栏Bingo的深度学习杂货店

Python3 编程注意点

整除 3//2 数字转字符串 str(number),字符串转数字 int(str) 字符串所有方法不修改字符串本身 .title() .upper() .l...

3255
来自专栏技术博文

PHP声明变量

变量是指在程序的运行过程中随时可以发生变化的量,在代码中可以只使用一个变量,也可以使用多个变量,变量中可以存放单词、数值、日期以及属性等。变量的值是临时的,当程...

27111
来自专栏杨熹的专栏

Day 1-Java-imooc-6.方法

课程地址:http://www.imooc.com/learn/85 总结图片来自 http://www.imooc.com/article/10535 ? -...

32911
来自专栏CodeSheep的技术分享

Java编程思想学习录(连载之:初始化与清理)

1858
来自专栏木子昭的博客

JS数据类型转换规则显示类型转换

JS数据类型 基础类型 String Boolean Number Symbol Undefine Null(typeof(null) === "object...

3215
来自专栏Java学习网

Java面试题系列之基础部分(三)——每天学5个问题

Java基础部分学习的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io的语法,虚拟机方面的语法,这些都是最基...

2288

扫码关注云+社区