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地址等的校验 - 爬虫项目中,特定内容的提取 使用原则 - 只要使用字符串等函数能解决的问题,就不要使用正则 - ...
随机推荐
- package。。
如果在源代码内没有加上 package ... 是无法以下面的方式访问到主类的. D:\lab_>java timer.LambdaTest 加载时会返回 "错误: 找不到或无法加载主 ...
- Blog开始
好久没更新Blog了,去看了下之前的csdn的blog感觉特别的乱,为此决心重开blog,记录工作及学习中的一些事 2013-10-28 ymc ...
- jsoup -- xml文档解析
jsoup -- xml文档解析 修改 https://jsoup.org/cookbook/modifying-data/set-attributes https://jsoup.org/cookb ...
- 为CKEditor开发插入代码的插件 已提供下载
http://www.cnblogs.com/moozi/archive/2010/01/06/1640034.html
- request参数集合绑定实体实现defaultmodebinder
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- iOS纯代码手动适配 分类: ios技术 2015-05-04 17:14 239人阅读 评论(0) 收藏
首先说下让自己的程序支持iPhone6和6+,第一种使用官方提供的launch screen.xib,这个直接看官方文档即可,这里不再多述:第二种方法是和之前iPhone5的类似,比较简单,为iPho ...
- 【转】安卓布局:layout_weight的理解
android:layout_weight详细分析介绍: 布局文件是:<?xml version="1.0" encoding="utf-8"?>& ...
- 输入计算表达式,将他们存在string【】中
#include<stdio.h>#include<string>#include<string.h>#include<stdlib.h>#includ ...
- Mybatis学习(6)动态加载、一二级缓存
一.动态加载: resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 需求: 如 ...
- Python关键字yield的解释
yield 是一个类似 return 的关键字,只是这个函数返回的是个生成器. >>> def createGenerator() : ... mylist = range(3) . ...