Python学习--16 正则表达式
正则表达式是一种描述性的语言,用来匹配字符串。凡是符合规则的字符串,我们认为就是匹配了。
正则表达式并非Python独有的,它与语言无关。很多语言都支持正则表达式。
我们经常用正则表达式来匹配电子邮件、手机号码、url等等。
来看一个简单的正则表达式,用于匹配手机号码:
^1[35789]\d{9}$
表示匹配以1开头,第二位是3或5或7或8或9,后面9位是数字,且后面必须以9位数字结尾。满足该规则的手机号就说明匹配该正则了。
Python里re模块包含所有正则表达式的功能。
注意:由于Python的字符串本身也用\转义,所以要特别注意:
s = 'ABC\\'
# 对应的正则表达式字符串变成:'ABC\'
使用Python的r前缀,就不用考虑转义的问题了:
s = r'ABC\'
# 对应的正则表达式字符串不变:'ABC\'
上面的正则用Python写则是:
import re
m = re.match(r'^1[35789]\d{9}$', '13271222223')
print(m)
m = re.match(r'^1[35789]\d{9}$', '23271222223')
print(m)
输出:
<_sre.SRE_Match object; span=(0, 11), match='13271222223'>
None
发现第二个例子匹配结果是None。Python中re模块match()方法判断是否匹配,如果匹配成功,返回一个Match对象,否则返回None。
所以我们可以写如下判断代码:
import re
if re.match(r'^1[35789]\d{9}$', '13271222223'):
print('ok')
else:
print('not match')
输出:
ok
元字符
像\d属于元字符。
常用的元字符:
| 代码 | 说明 |
|---|---|
| . | 匹配除换行符以外的任意字符 |
| \w | 匹配字母或数字或下划线或汉字 |
| \s | 匹配任意的空白符 |
| \d | 匹配数字 |
| \b | 匹配单词的开始或结束 |
| ^ | 匹配字符串的开始 |
| $ | 匹配字符串的结束 |
重复
像{9}属于重复限定符。
常用的限定符:
| 代码/语法 | 说明 |
|---|---|
| * | 重复0次或更多次 |
| + | 重复1次或更多次 |
| ? | 重复0次或1次 |
| {n} | 重复n次 |
| {n,} | 重复n次或更多次 |
| {n,m} | 重复n到m次 |
字符类
[35789]表示匹配3或5或7或8或9中的某一个。像[aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(.或?或!)。
像[0-9]代表的含意与\d就是完全一致的:一位数字;同理[a-z0-9A-Z_]也完全等同于\w(如果只考虑英文的话)。
使用正则切分字符串
re模块里的split可以代替常规的split。示例:
# coding: utf-8
import re
string = 'abc d e'
print(string.split(' '))
print(re.split(r'\s+', string))
输出:
['abc', 'd', '', 'e']
['abc', 'd', 'e']
我们发现常规的切分字符串无法识别连续的空格,但正则可以。
分组
正则表达式还可以提取子串。用()表示的就是要提取的分组。
(\d{1,3}\.){3}\d{1,3}是一个简单的IP地址匹配表达式。要理解这个表达式,可以按顺序分析:\d{1,3}匹配1到3位的数字,(\d{1,3}\.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(\d{1,3})。
import re
m = re.match(r'(\d{1,3}\.){3}\d{1,3}', '11.22.33.44')
print(m.group(0))
print(m.group(1))
print(m.groups())
输出:
11.22.33.44
33.
('33.',)
group(0)永远是原始字符串,group(1)、group(2)……表示第1、2、……个子串。groups()返回所有子串的tuple。
这里由于只有一个分组,所以打印group(2)会报错。
贪婪匹配
当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。
比如我们要匹配数字102300后面的0:
import re
m = re.match(r'^(\d+)(0*)$', '102300')
print(m.groups())
输出:
('102300', '')
由于贪婪匹配,\d+会一直匹配到末尾,把整个数字都匹配了,0*就只能匹配空字符串了。我们改改:
import re
m = re.match(r'^(\d+?)(0*)$', '102300')
print(m.groups())
输出:
('1023', '00')
加个?就可以让\d+采用非贪婪匹配。
懒惰限定符:
| 代码/语法 | 说明 |
|---|---|
| *? | 重复任意次,但尽可能少重复 |
| +? | 重复1次或更多次,但尽可能少重复 |
| ?? | 重复0次或1次,但尽可能少重复 |
| {n,m}? | 重复n到m次,但尽可能少重复 |
| {n,}? | 重复n次以上,但尽可能少重复 |
正则表达式非常强大,本节只是讲解了基础。更多关于正则的知识,大家可以找资料学习。
参考:
1、正则表达式30分钟入门教程
http://deerchao.net/tutorials/regex/regex.htm
Python学习--16 正则表达式的更多相关文章
- [Python学习笔记]正则表达式总结
常用缩写字符及其含义表格查询 缩写字符分类 含义 \d 0-9的任意数字 \D 除0-9的数字以外的任何字符 \w 任何字母.数字或下划线字符(可以认为是匹配"单词"字符) \W ...
- Python学习 之 正则表达式
1.简单的正则表达式 import re s=r'abc' re.findall(s,"aaaaaaaaaaaaaaa") #结果为[] re.findall(s,"ab ...
- Python学习笔记——正则表达式入门
# 本文对正则知识不做详细解释,仅作入门级的正则知识目录. 正则表达式的强大早有耳闻,大一时参加一次选拔考试,题目就是用做个HTML解析器,正则的优势表现得淋漓尽致.题外话不多讲,直接上干货: 1. ...
- python学习日记(正则表达式)
定义 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. re 模块使 Pyth ...
- python学习笔记——正则表达式regex
1 概述 1.1 定义 本质是由一系列字符和特殊符号组成的字串,用来表示一定规则的某一类字符串. 1.2 特点 正则表达式是一个独立的技术,其在多种编程语言中使用. 在python语言中的正则表达式模 ...
- python学习笔记----正则表达式
正则: regular expression 常用的场景: #正则的包 >>> import re #match:开头匹配,匹配到,返回一个匹配对象,否则返回None >> ...
- python学习day25 正则表达式
4.30-25 正则表达式与re模块 re模块本身是用来操作正则表达式,与正则本身没有关系 正则表达式是指一规则,匹配字符串的规则 1.正则表达式regex 正则表达式regex是指一规则,匹配字符串 ...
- Python学习 :正则表达式
正则表达式 python 使用正则表达式(re)来进行匹配引擎搜索 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串” 关于正则表达式 ...
- python 学习总结----正则表达式
正则表达式 应用场景 - 特定规律字符串的查找,切割,替换 - 邮箱格式:URl,IP地址等的校验 - 爬虫项目中,特定内容的提取 使用原则 - 只要使用字符串等函数能解决的问题,就不要使用正则 - ...
随机推荐
- 第五弹:VGG
接下来讲一个目前经常被用到的模型,来自牛津大学的VGG,该网络目前还有很多改进版本,这里只讲一下最初的模型,分别从论文解析和模型理解两部分组成. 一.论文解析 一:摘要 -- 从Alex-net发展而 ...
- java 并发多线程异步
http://www.cnblogs.com/dolphin0520/category/602384.html 并发 http://blog.csdn.net/column/details/con ...
- 机器学习模型 bias 和 variance 的直观判断
假设我们已经训练得到 一个模型,那么我们怎么直观判断这个 模型的 bias 和 variance? 直观方法: 如果模型的 训练错误 比较大,并且 验证错误 和 训练错误 差不多一样,都比较大,我们就 ...
- android测试之——mokeyrunner上(二)
以下是本人原创,如若转载和使用请注明转载地址.本博客信息切勿用于商业,可以个人使用,若喜欢我的博客,请关注我,谢谢!博客地址 感谢您支持我的博客,我的动力是您的支持和关注!如若转载和使用请注明转载地址 ...
- AOP:代理实现方式①通过继承②通过接口
文件结构: 添加日志: package com.wangcf.manager; public class LogManager { public void add(){ System.out.prin ...
- mongodb 压缩——3.0+支持zlib和snappy
转自:https://scalegrid.io/blog/enabling-data-compression-in-mongodb-3-0/ MongoDB 3.0 with the wired ti ...
- iOS 8自定义动画转场上手指南
原文:http://www.cocoachina.com/ios/20150126/11011.html iOS 5发布的时候,苹果针对应用程序界面的设计,提出了一种全新的,革命性的方法—Storyb ...
- iOS开发——Xcode快捷键
1.共用的一些方法 Command + A: 全选Command + C: 复制Command + V: 粘贴Command + X: 剪切Command + Z: 撤销Shift + Command ...
- ucos内存管理原理详解
应用程序中为了某种特殊需要,经常需要动态的分配内存,而操作系统的特质置一,就是能不能保证动态内存分配的时效性,也就是说分配时间是可确定的 Ucos提供内存分配功能,它将内存空间分为两级管理,将一块连续 ...
- dom4j生成和解析xml文件
dom4j生成和解析xml文件 要生成和解析如下格式的xml文件: <?xml version="1.0" encoding="UTF-8"?> & ...