《Python》正则表达式
re模块
正则表达式:
应用场景:
1、判断某一个字符串是否符合规则 (注册时:判断手机号,身份证号,邮箱格式是否正确)
2、将符合规则的内容从一个庞大的字符串体系中提取出来 (爬虫,日志分析)
什么是正则表达式:
只和字符串打交道,是一种规则,来约束字符串的规则
字符组:
在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用 [ ] 表示。
字符分为很多类,比如数字,字母,标点等等。
[0123456789] 表示0-9都可以匹配
[0-9] 用 - 表示范围,[0-9] 和 [0123456789] 是一样的
[a-z] 表示所有的小写字母
[A-Z] 表示所有的大写字母
[0-9a-fA-F] 可以匹配数字,大小写形式的a~f,常用来验证十六进制字符
原理是通过ASCII编码,小的一个值指向大的一个值
元字符:
\w 匹配字母或数字或下划线
\W 匹配非字母或非数字或非下划线
\s 匹配任意的空白符(空格、换行\n、制表符\t)
\S 匹配非空白符
\d 匹配数字
\D 匹配非数字
\n 匹配一个换行符
\t 匹配一个制表符
\b 匹配一个单词的边界
\A 匹配以什么开头,与 ^ 的功能一样 (\A匹配内容)
\Z 匹配以什么结尾,与 $ 的功能一样 (匹配内容\Z)
. 匹配除换行符以外的任意字符
^ 匹配字符串的开始
$ 匹配字符串的结尾
a|b 匹配字符a或字符b (把长的放前面,如 abc|ab)
() 匹配括号内的表达式,也表示一个组
[...] 匹配字符组中的字符
[^...] 匹配除了字符组中字符的所有字符
量词:
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次货更多次
{n,m} 重复n到m次

.^$
*+?{}

注意:前面的 *,+,? 等都是贪婪匹配,也就是尽可能多的匹配,后面加?使其变成惰性匹配

字符集 [ ] [ ^ ]

分组 ()与 或 | [ ^ ]
身份证号码是一个长度为15或18个字符的字符串,如果是15位则全部由数字组成,首位不能为0;如果是18位的,则前17位全部是数字,末位可以是数字或x

转义符 \
在正则表达式中,有很多有特殊意义的是元字符,比如\n和\s等,如果要在正则中匹配正常的"\n"而不是"换行符"就需要对"\"进行转义,变成'\\'。

贪婪匹配
贪婪匹配:在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配

几个常用的非贪婪匹配
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
. * ?
. 是任意字符
* 是取 0 至 无限长度
? 是非贪婪模式
合在一起就是,取尽量少的任意字符,一般不会这么单独写,大多用在:
. * ? x 就是取前面任意长度的字符,直到一个 x 出现
import re
# \w与\W
print(re.findall('\w', 'hello egon 123'))
# ['h', 'e', 'l', 'l', 'o', 'e', 'g', 'o', 'n', '1', '2', '3']
print(re.findall('\W', 'hello egon 123'))
# [' ', ' '] # \s与\S
print(re.findall('\s', 'hello egon 123'))
# [' ', ' ']
print(re.findall('\S', 'hello egon 123'))
# ['h', 'e', 'l', 'l', 'o', 'e', 'g', 'o', 'n', '1', '2', '3'] # \n与\t都是空,都可以被\s匹配
print(re.findall('\s', 'hello \n egon \t 123'))
# [' ', '\n', ' ', ' ', '\t', ' '] # \n与\t
print(re.findall(r'\n', 'hello egon \n123'))
# ['\n']
print(re.findall(r'\t', 'hello egon \t 123'))
# ['\t'] # \d与\D
print(re.findall('\d', 'hello egon 123'))
# ['1', '2', '3']
print(re.findall('\D', 'hello egon 123'))
# ['h', 'e', 'l', 'l', 'o', ' ', 'e', 'g', 'o', 'n', ' '] # \A与\Z
print(re.findall('\Ahe', 'hello egon 123'))
# ['he']
print(re.findall('123\Z', 'hello egon 123'))
# ['123'] # ^与$
print(re.findall('^he', 'hello egon 123'))
# ['he']
print(re.findall('123$', 'hello egon 123'))
# ['123'] # 重复匹配:. * ? .* .*? + {n,m} | # .
print(re.findall('a.b', 'a1b'))
# ['a1b']
print(re.findall('a.b', 'a1b a*b a b aaab'))
# ['a1b', 'a*b', 'a b', 'aab']
print(re.findall('a.b', 'a\nb'))
# [] # *
print(re.findall('ab*', 'bbbbbbb'))
# []
print(re.findall('ab*', 'a'))
# ['a']
print(re.findall('ab*', 'abbbbbb'))
# ['abbbbbb'] # ?
print(re.findall('ab?', 'a'))
# ['a']
print(re.findall('ab?', 'abbbb'))
# ['ab'] # 匹配所有包含小数在内的数字
print(re.findall('\d+\.?\d*', 'sdfsdfs231sdsd1.123sdfsfas34jk23kj52k3jh4kj'))
# ['231', '1.123', '34', '23', '52', '3', '4'] # .*默认为贪婪匹配
print(re.findall('a.*b', 'a1b222222222b'))
# ['a1b222222222b'] # .*? 为非贪婪匹配:推荐使用
print(re.findall('a.*?b', 'a1b22222222b'))
# ['a1b'] # +
print(re.findall('ab+', 'a'))
# []
print(re.findall('ab+', 'abbb'))
# ['abbb'] # {n,m}
print(re.findall('ab{2}', 'abbbb'))
# ['abb']
print(re.findall('ab{2,4}', 'abbb'))
# ['abbb']
print(re.findall('ab{1,}', 'abbbbbb'))
# ['abbbbbb']
print(re.findall('ab{0,}', 'a'))
# ['a'] #[]
print(re.findall('a[1*-]b', 'a1b a*b a-b'))
# ['a1b', 'a*b', 'a-b'] []内的都为普通字符了,且如果-没有被转意的话,应该放到[]的开头或结尾
print(re.findall('a[^1*-]b', 'a1b a*b a-b a=b'))
# ['a=b'] []内的^代表的意思是取反,所以结果为['a=b']
print(re.findall('a[0-9]b', 'a1b a*b a-b a=b'))
# ['a1b']
print(re.findall('a[a-z]b', 'a1b a*b a-b a=b aeb'))
# ['aeb']
print(re.findall('a[a-zA-Z]b', 'a1b a*b a-b a=b aeb aEb'))
# ['aeb', 'aEb'] # 转义\
print(re.findall('a\\c', 'a\c'))
# 对于正则来说a\\c确实可以匹配到a\c,但是在python解释器读取a\\c时,会发生转义,然后交给re去执行,所以抛出异常
print(re.findall(r'a\\c', 'a\c'))
# ['a\\c'] r代表告诉解释器使用rawstring,即原生字符串,把我们正则内的所有符号都当普通字符处理,不要转义
print(re.findall('a\\\\c', 'a\c'))
# 同上面的意思一样,和上面的结果一样都是['a\\c'] # ()分组
print(re.findall('ab+', 'ababab123'))
# ['ab', 'ab', 'ab']
print(re.findall('(ab)+123', 'ababab123'))
# ['ab'],匹配到末尾的ab123中的ab
print(re.findall('(?:ab)+123', 'ababab123'))
# ['ababab123'] findall的结果不是匹配的全部内容,而是组内的内容,?:可以让结果为匹配的全部内容
re模块下的常用方法:
import re # findall
print(re.findall('\d', 'sdfh34h2h423h2h23h'))
# ['3', '4', '2', '4', '2', '3', '2', '2', '3']
# 返回值是一个列表,里面的每个元素是所有匹配到的项 # search
ret = re.search('\d', 'sdfh34h2h423h2h23h')
print(ret)
# <re.Match object; span=(4, 5), match='3'>
print(ret.group())
# ret = re.search('\d', 'sdhfsd')
print(ret)
# None
if ret:
print(ret.group())
# search返回值:
# 返回一个re_Match对象
# 通过group取值
# 且只包含第一个匹配到值
import re # findall 有一个特点,会优先显示分组中的内容
ret = re.findall('www.(baidu|oldboy).com', 'www.baidu.com')
print(ret)
# ['baidu'] ret = re.search('www.(baidu|oldboy).com', 'www.baidu.com')
print(ret)
# <re.Match object; span=(0, 13), match='www.baidu.com'>
print(ret.group())
# www.baidu.com
《Python》正则表达式的更多相关文章
- Python 正则表达式入门(中级篇)
Python 正则表达式入门(中级篇) 初级篇链接:http://www.cnblogs.com/chuxiuhong/p/5885073.html 上一篇我们说在这一篇里,我们会介绍子表达式,向前向 ...
- Python正则表达式中的re.S
title: Python正则表达式中的re.S date: 2014-12-21 09:55:54 categories: [Python] tags: [正则表达式,python] --- 在Py ...
- Python 正则表达式入门(初级篇)
Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写. 转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达 ...
- python正则表达式re
Python正则表达式: re 正则表达式的元字符有. ^ $ * ? { [ ] | ( ).表示任意字符[]用来匹配一个指定的字符类别,所谓的字符类别就是你想匹配的一个字符集,对于字符集中的字符可 ...
- Python正则表达式详解
我用双手成就你的梦想 python正则表达式 ^ 匹配开始 $ 匹配行尾 . 匹配出换行符以外的任何单个字符,使用-m选项允许其匹配换行符也是如此 [...] 匹配括号内任何当个字符(也有或的意思) ...
- 比较详细Python正则表达式操作指南(re使用)
比较详细Python正则表达式操作指南(re使用) Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式.Python 1.5之前版本则是通过 regex 模块提供 E ...
- Python正则表达式学习摘要及资料
摘要 在正则表达式中,如果直接给出字符,就是精确匹配. {m,n}? 对于前一个字符重复 m 到 n 次,并且取尽可能少的情况 在字符串'aaaaaa'中,a{2,4} 会匹配 4 个 a,但 a{2 ...
- python正则表达式 小例几则
会用到的语法 正则字符 释义 举例 + 前面元素至少出现一次 ab+:ab.abbbb 等 * 前面元素出现0次或多次 ab*:a.ab.abb 等 ? 匹配前面的一次或0次 Ab?: A.Ab 等 ...
- Python 正则表达式-OK
Python正则表达式入门 一. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分. 正则表达式是用于处理字符串的强大工具, 拥有自己独特的语法以及一个独立的处理引擎, 效率上 ...
- Python天天美味(15) - Python正则表达式操作指南(re使用)(转)
http://www.cnblogs.com/coderzh/archive/2008/05/06/1185755.html 简介 Python 自1.5版本起增加了re 模块,它提供 Perl 风格 ...
随机推荐
- lua --- 点号 和 冒号
冒号的作用:1.定义函数时,给函数添加隐藏的第一个参数 self2.调用函数时,默认把当前调用者作为第一个参数传递进去 如 a:b(c) 可以理解为 a.b(a, c) 以下是用点号的定义和调用函数的 ...
- C#接口实现技巧之借助第三方
一个类继承了一个接口,对接口实现通常的做法---直接在这个类中对接口进行实现. 利用继承的概念,可以很巧妙地借助第三方类对接口进行实现,这种方式在实际的项目开发过程中其实用途很是比较大的,至少我们的游 ...
- MyBatis配置文件中的常用配置
一.连接数据库的配置单独放在一个properties文件中 之前,我们是直接将数据库的连接配置信息写在了MyBatis的conf.xml文件中,如下: <?xml version="1 ...
- 守护进程函数——内部的小范围try catch 增强了 while死循环执行的 可靠性
void Watch() { try { LogHelper.WriteLog("WatchServi ...
- 树莓派 CSI摄像头 No data received from sensor. Check all connections, including the Sunny one on the camera board
不知道为什么摄像头在包里放了两天旧坏了,中间完全没用过摄像头的功能,查了资料,原因大概有两种 1)sunny烧了 2)试摄像头传感器坏了 这两天没有插拔过摄像头,可能是树莓派漏电了,也可能是它被压坏了 ...
- matlab:统计矩阵中某元素的个数
三种统计方法: A=ceil(rand(,)*); a=; %第一种 sum(A(:)==a): %第二种 length(find(A==a); %第三种 logical=(A=a); sum(log ...
- UVALive - 7041 G - The Problem to Slow Down You
题意:求两个串的公共回文子串个数 题解:建两个回文自动机,从0和1各跑一边就是答案了,因为对于回文自动机来说,从头开始dfs就能找出该字符串的所有回文串 //#pragma GCC optimize( ...
- MVC实战之排球计分(三)—— 模型类的设计与实现
此软件使用的数据库连接方式code first 由EF框架产生数据库. code first需要对模型类设计和实现.模型类是现实实体在计算机中的表示.它贯穿于整个架构, 负担着在各层次及模块间传递数据 ...
- json2.js 序列化 和反序列化 转
http://www.cnblogs.com/youring2/archive/2013/03/01/2938850.html json2.js的源码地址: https://github.com/do ...
- PHP 进阶之路 - 深入理解 FastCGI 协议以及在 PHP 中的实现
在讨论 FastCGI 之前,不得不说传统的 CGI 的工作原理,同时应该大概了解 CGI 1.1 协议 传统 CGI 工作原理分析 客户端访问某个 URL 地址之后,通过 GET/POST/PUT ...
