Python 正则表达式基础知识点及实例

1. 什么是正则表达式

正则表达式(Regular Expressions),也称为 “regex” 或 “regexp” 是使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,这样程序就可以将该模式与任意文本字符串相匹配。

使用正则表达式,可以为要匹配的可能字符串集指定规则;此集可能包含英语句子,电子邮件地址,TeX命令或你喜欢的任何内容

正则表达式引擎

采用不同算法,检查处理正则表达式的软件模块 PCRE (perl compatible regular expressions)

正则表达式的元字符分类: 字符匹配,匹配次数,位置锚定,分组

Python的正则表达式是PCRE标准的。

2. 正则表达式基础

# 字符匹配

. 匹配任意单个字符(换行符除外)

[]匹配指定范围内的任意单个字符: [0-9] [a-z]

^[xxx]以[]内的任意字符开头

[^xxx]: 除了[]内的字符,相当于取反

# 匹配次数

用于指定前面的字符要出现几次

* 匹配前面的字符的任意次,包括0次, 贪婪匹配:尽可能长的匹配
.* 任意长度的任意字符
? 匹配其前面的字符0或1次
+ 匹配前面的字符至少1次
{n} 匹配前面的字符n次
{m,n} 匹配前面的字符至少m次,最多n次如{1,3} 匹配1到3次
{n,} 匹配前面的字符至少n次

# 位置锚定
# 用于定位出现的位置

^ 行首

$ 行尾

^$ 空行

# 分组
() 分组,用()将多个字符捆绑在一起,当作一个整体处理
后向引用: \1,\2

# | 或者
a|b a 或 b
(A|a)bc Abc或abc

# \ 转义
\ 反斜杠后面可以跟各种字符,以指示各种特殊序列。它也用于转义所有元字符.因此您仍然可以在模式中匹配它们,如果你需要匹配 [ 或 \,你可以在它们前面加一个反斜杠来移除它们的特殊含义:\[ 或 \\。
在python中取消转义推荐使用r,如果要匹配'\n',因为'\n'有特殊含义:回车。要匹配'\n'可以以写'\\n',在Python中可以使用r'\n'。

\d 匹配任何十进制数,等价于类 [0-9]
\w 匹配任何字母与数字字符包括下划线;这相当于类 [a-zA-Z0-9_]。
\s 匹配任何空白字符;这等价于类 [ \t\n\r\f\v]。

\D 匹配任何非数字字符;这等价于类 [^0-9]。
\W 匹配任何非字母与数字字符;这相当于类 [^a-zA-Z0-9_]。
\S 匹配任何非空白字符;这相当于类 [^ \t\n\r\f\v]。

3. Python中使用正则表达式

在python中使用正则表达式常用的模块为:re。

3.1 re常用的方法

# re.findall('正则表达式','待匹配的文本')  根据正则匹配出所有符合条件的数据,返回列表
>>> re.findall('[0-9]', "Hello world 123")
['1', '2', '3']
# 如果匹配不到findall返回一个空列表

# re.finditer('正则表达式','待匹配的文本') 根据正则匹配出所有符合条件的数据,返回一个对象
>>> re.finditer('[0-9]', "Hello world 123")
<callable_iterator object at 0x7f3409296d68>
# 取值:
>>> res = re.finditer('[0-9]', "Hello world 123")
>>> for i in res:
...     print(i.group())
...
1
2
3

# 如果匹配不到finditer返回空。

# findall 和finditer功能一样,但是finditer更节省内存。

# re.search('正则表达式','待匹配的文本')   根据正则匹配到一个符合条件的就结束
>>> res = re.search('l', "Hello world 123")
>>> res
<_sre.SRE_Match object; span=(2, 3), match='l'>
>>> res.group()
'l'
# 匹配到一个就返回,group()返回具体的元素,如果匹配不到search返回None,使用group取值就会报错:
AttributeError: 'NoneType' object has no attribute 'goup'

# re.match('正则表达式','待匹配的文本') 根据正则从头开始匹配(文本内容必须在开头匹配上)
>>> res = re.match('e', "Hello world 123")   # e 不在开头,所以匹配不上,返回None
>>> print(res)
None

>>> res = re.match('H', "Hello world 123")  # H 为开头能匹配上
>>> print(res)
<_sre.SRE_Match object; span=(0, 1), match='H'>
>>> print(res.group())
H

#如果没有匹配到,match会返回None 使用group取值的时候也会直接报错
AttributeError: 'NoneType' object has no attribute 'group'

# search和match匹配不到都会报错,可以处理一下:
if res:
    print(res.group())
else:
    print('没有匹配到')

# re.split 分割
>>> re.split('[0-9]', "Hello 123 world")    # 按匹配到的分割,返回一个列表
['Hello ', '', '', ' world'] 

# re.sub('要匹配的', '要替换的', '文本')  替换
>>> re.sub('[0-9]','A', "Hello 123 world")  # 默认替换全部
'Hello AAA world'
>>> re.sub('[0-9]','A', "Hello 123 world",1) # 替换一次
'Hello A23 world'
>>> re.sub('[0-9]','A', "Hello 123 world",2) # 替换两次
'Hello AA3 world'
# re.subn() 和re.sub 功能一样,但是返回元组 并提示替换了几处
>>> re.subn('[0-9]','A', "Hello 123 world")
('Hello AAA world', 3)
>>> re.subn('[0-9]','A', "Hello 123 world", 1)
('Hello A23 world', 1)

# 如果一个正则表达式在程序中经常用到,这样每次都写太麻烦,可以使用compile将正则表达式的样式编译为一个正则表达式对象 (正则对象)
# 例如 正则表达式'^\d{3,6}'经常使用
>>> obj = re.compile('^\d{3,6}')
>>> obj.findall("123 Hello")
['123']
>>> res = obj.search("123 Hello")
>>> res.group()
'123'
# obj还可以使用 finditer,match,split,subn,sub

# 分组
>>> res = re.search('[1-9]\d{16}([0-9x])','37152119841105155x')
>>> res.group()
'37152119841105155x'
>>> res.group(1)  # 只打印分组1里的内容,1为第一个分组,这里面只有([0-9x])所以打印x
'x'
>>> res = re.search('[1-9](\d{16})([0-9x])','37152119841105155x')
>>> res.group()
'37152119841105155x'
>>> res.group(1)   # (\d{16}) 为第1个分组
'7152119841105155'
>>> res.group(2)	# ([0-9x]) 为第2个分组
'x'
# 这种取分组里的值也为索引取值

# findall优先打印出分组里的内容
>>> re.findall('[1-9]\d{16}([0-9x])','37152119841105155x')
['x']

# 取消分组: ?:
>>> res = re.findall('[1-9]\d{16}(?:[0-9x])','37152119841105155x')
>>> res   # (?:[0-9x])
['37152119841105155x']

# 上面的分组为无名分组,分组也可以有名字。
# 有名分组  ?P<分组名称>
>>> res = re.search('[1-9](?P<first>\d{16})(?P<second>[0-9x])','37152119841105155x')
>>> res.group()
'37152119841105155x'
>>> res.group('first')
'7152119841105155'
>>> res.group('second')
'x'
# 分组后也可以使用索引到值:
>>> res.group(2)
'x'

3.2 re模块练习

爬链家二手房前十页

import re
import requests 

for i in range(1,11):

    url = 'https://bj.lianjia.com/ershoufang/pg{}srs%E6%97%A7%E5%AE%AB/'.format(i)

    r = requests.get(url)

    title = re.findall('data-is_focus="" data-sl="">(.*?)</a>',r.text)
    price = re.findall('<span>([0-9]{3})</span>',r.text)

    address = re.findall('data-log_index="\d" data-el="region">(.*?)</a>', r.text)
    houseIcon = re.findall('<span class="houseIcon"></span>(.*?)</div>', r.text)

    res = zip(title,price,address,houseIcon)
    for i in res:
    # print("%s \t%s(万) \t%s\t%s" % (i[0], i[1], i[2], i[3]))
        print("""
    小区名: %s,
    总价: %s万,
    地址: %s,
    房型: %s""" % (i[0], i[1], i[2], i[3]))

# 执行结果:
[root@hans_tencent_centos82 module]# python3 houses.py 

    小区名: 红星楼小区 南北通透一居室 满五唯一商品房,
    总价: 185万,
    地址: 红星楼 ,
    房型: 1室1厅 | 46.46平米 | 南 北 | 简装 | 顶层(共6层) | 1989年建 | 板楼

    小区名: 旧宫北里 2室2厅 南 北,
    总价: 469万,
    地址: 旧宫北里 ,
    房型: 2室2厅 | 96.55平米 | 南 北 | 精装 | 高楼层(共9层) | 2004年建 | 板楼

    小区名: 亦庄北岸 3室1厅 南 北,
    总价: 558万,
    地址: 亦庄北岸 ,
    房型: 3室1厅 | 109.58平米 | 南 北 | 精装 | 中楼层(共15层) | 2008年建 | 板塔结合

参考内容:

Python官方文档

内容扩展:

Python对正则表达式的支持

Python提供了re模块来支持正则表达式相关操作,下面是re模块中的核心函数。

函数 说明
compile(pattern, flags=0) 编译正则表达式返回正则表达式对象
match(pattern, string, flags=0) 用正则表达式匹配字符串 成功返回匹配对象 否则返回None
search(pattern, string, flags=0) 搜索字符串中第一次出现正则表达式的模式 成功返回匹配对象 否则返回None
split(pattern, string, maxsplit=0, flags=0) 用正则表达式指定的模式分隔符拆分字符串 返回列表
sub(pattern, repl, string, count=0, flags=0) 用指定的字符串替换原字符串中与正则表达式匹配的模式 可以用count指定替换的次数
fullmatch(pattern, string, flags=0) match函数的完全匹配(从字符串开头到结尾)版本
findall(pattern, string, flags=0) 查找字符串所有与正则表达式匹配的模式 返回字符串的列表
finditer(pattern, string, flags=0) 查找字符串所有与正则表达式匹配的模式 返回一个迭代器
purge() 清除隐式编译的正则表达式的缓存
re.I / re.IGNORECASE 忽略大小写匹配标记
re.M / re.MULTILINE 多行匹配标记

说明: 上面提到的re模块中的这些函数,实际开发中也可以用正则表达式对象的方法替代对这些函数的使用,如果一个正则表达式需要重复的使用,那么先通过compile函数编译正则表达式并创建出正则表达式对象无疑是更为明智的选择。

到此这篇关于Python 正则表达式基础知识点及实例的文章就介绍到这了,更多相关Python 正则表达式 浅析内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python全栈之正则表达式

    目录 1. 正则表达式_匹配单个字符 2. 正则表达式_匹配多个字符 3. 正则表达式_匹配分组 小提示: 4. 小练习 答案: 总结 1. 正则表达式_匹配单个字符 正则表达式在线测试: http://tool.chinaz.com/regex # ### 正则表达式 - 匹配单个字符 import re """lst = re.findall(正则表达式,字符串)""" # (1) 预定义字符集 # \d 匹配数字 strvar = &quo

  • Python 正则表达式详解

    目录 1.正则表达式是什么 2.1用正则表达式 2.2匹配原理 2.3常用函数 总结 1.正则表达式是什么 很简单就是一种字符串匹配,eg: 比如你在注册账户时我们需要对用户的用户名判断是否合法,这时候就需要对用户输入的检索,或者给你5-11位的数字你确定他是否为qq号. 2.1用正则表达式 import re 2.2匹配原理 import re msg = '董小姐桥边姑娘南方小姐' pattern = re.compile('董小姐') result = pattern.match(msg)

  • python 正则表达式的使用

    目录 1.正则表达式 1.1 正则表达式字符串 1.1.1 元字符 1.1.2 字符转义 1.1.3 开始与结束字符 1.2 字符类 1.2.1 定义字符类 1.2.2 字符串取反 1.2.3 区间 1.2.4 预定义字符类 1.3 量词 1.3.1 量词的使用 1.3.2 贪婪量词和懒惰量词 1.4 分组 1.4.1 分组的使用 1.4.2 分组命名 1.4.3 反向引用分组 1.4.4 非捕获分组 1.5 re模块 1.5.1 search()和match()函数 1.5.2 findall

  • Python 正则表达式大全(推荐)

    目录 1 前言 2 基本语法 2.1 match函数 2.2 search 函数 2.3 sub 函数 3 特殊类语法 3.1 字符类 3.2 特殊字符类 3.3 重复匹配 3.4 非贪婪重复 3.5 圆括号分组 3.6 反向引用 3.7 锚点 3.8 带括号的特殊语法 1 前言 正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"))操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串&quo

  • python正则表达式最详解

    目录 一.正则表达式–元字符 1. 数量词 2. 字符匹配 3. 边界匹配 4. 组 5. 匹配模式参数 二.方法 re.findall re.match group匹配对象 re.search re.compile 三.检索和替换 re.sub 替换字符串 总结 一.正则表达式–元字符 re 模块使 Python 语言拥有全部的正则表达式功能 1. 数量词 # 提取大小写字母混合的单词 import re a = 'Excel 12345Word23456PPT12Lr' r = re.fin

  • Python 正则表达式基础知识点及实例

    1. 什么是正则表达式 正则表达式(Regular Expressions),也称为 "regex" 或 "regexp" 是使用单个字符串来描述.匹配一系列匹配某个句法规则的字符串,这样程序就可以将该模式与任意文本字符串相匹配. 使用正则表达式,可以为要匹配的可能字符串集指定规则:此集可能包含英语句子,电子邮件地址,TeX命令或你喜欢的任何内容 正则表达式引擎 采用不同算法,检查处理正则表达式的软件模块 PCRE (perl compatible regular

  • python爬虫基础知识点整理

    首先爬虫是什么? 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本. 根据我的经验,要学习Python爬虫,我们要学习的共有以下几点: Python基础知识 Python中urllib和urllib2库的用法 Python正则表达式 Python爬虫框架Scrapy Python爬虫更高级的功能 1.Python基础学习 首先,我们要用Python写爬虫,肯定要了解Python的基础吧,万丈高楼平地起,

  • python正则表达式匹配IP代码实例

    这篇文章主要介绍了python正则表达式匹配IP代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 import re re.search(r'([1]\d\d|2[0-4]\d|25[0-5])','192') #re.search(r'([01]\d\d)','1XX') #[01] \d \d # 1 0-9 0-9 #re.search(r'(2[0-4]\d)','2XX') #2 [0-4] \d #2 0-4 0-9 #re.

  • java向下转型基础知识点及实例

    1.概念 向下转型就是父类对象转成子类对象.我们把一个父类引用 Animal类型的引用 给了一个 Bird类型 的引用,这就是向下转型 2.格式 子类 子类对象=(子类)父类实例 3.注意 向下转型的时候一定要进行强制类型转换 4.实例 class Animal { public String name; public void eat() { System.out.println(this.name + " 正在吃"); } } class Cat extends Animal {

  • java中Class类的基础知识点及实例

    1.说明 Class本身也是一个类. Class对象只能由系统确定. JVM中只有一个Class实例可以加载一个类. Class对应于JVM中加载的.class文件. 每一类的实例都会记住它是由哪个Class例子产生的. 通过Class,可以完全获得一个类中所有加载的结构. Class是Reflection的根源.对于任何你想动态加载和运行的类,只有先获得相应的Class对象. 2.实例 package com.volcano.reflection; import java.lang.annot

  • java局部变量表的基础知识点及实例

    说明 1.局部变量表也叫局部变量数组或本地变量表.定义为一个数组,主要用于存储方法参数和定义方法中的局部变量.这些数据类型包括各种基本数据类型.对象参考和returnAddress类型. 2.因为局部变量表是建立在线程栈上的线程私有数据,所以没有数据安全问题. 实例 private static int count=0; public static void recursion(int a,int b,int c){ long l1=12; short sl=1; byte b1=1; Stri

  • php聚合式迭代器的基础知识点及实例代码

    说明 1.实现其他迭代器功能的接口,相当于在其他迭代器上安装一个外壳,只有一种方法. 2.聚合迭代器可以与许多迭代器结合,实现更高效的迭代. 实例 class MainIterator implements Iterator { private $var = array(); public function __construct($array) //构造函数, 初始化对象数组 { if (is_array($array)) { $this->var = $array; } } public f

  • Python正则表达式匹配ip地址实例

    本文实例讲述了正则表达式匹配ip地址实例.代码结构非常简单易懂.分享给大家供大家参考. 主要实现代码如下: import re reip = re.compile(r'(?<![\.\d])(?:\d{1,3}\.){3}\d{1,3}(?![\.\d])') for ip in reip.findall(line): print "ip>>>", ip PS:关于正则,这里再为大家推荐2款非常方便的正则表达式工具供大家参考使用: JavaScript正则表达式

  • Python正则表达式以及常用匹配实例

    目录 1 正则表达式对象 2 正则表达式修饰符 - 可选标志 3 正则表达式字符意义 re.match函数 re.search方法 替换re.sub re.compile 函数 findall re.finditer re.split 练习: 补充:Python的re模块两个比较常用的方法 总结 1 正则表达式对象 re.RegexObject re.compile() 返回 RegexObject 对象. re.MatchObject group() 返回被 RE 匹配的字符串. start(

  • python正则表达式常见的知识点汇总

    目录 一.介绍 二.查找方法的使用 1.match方法(只匹配字符串开头) 2.search方法(扫描整个字符串,找到第一个匹配) 3.re.match与re.search的区别 4.findall方法(扫描整个字符串,找到所有的匹配) 5.finditer方法(扫描整个字符串,找到所有的匹配,并返回一个可迭代对象) 三.re.Match类介绍 四.正则表达式模式 1.非打印字符 2.特殊字符 3.定位符 4.限定符 五.替换 六.贪婪模式和非贪婪模式 七.示例 1.匹配用户名 2.匹配手机号

随机推荐