正则表达式符号介绍

按照博客中的表格罗列的去记即可

了解

  • \w,\s,\d与\W,\S,\D相反的匹配关系(对应的两者结合就是匹配全局)

  • \t匹配制表符

  • \b匹配结尾的指定单词

优先掌握

  • ^:以什么什么开头

    • ^[a-z]

    • ^[0-9]

  • $:以什么什么结尾

ps:^与$连用能够精准匹配固定长度的目标字符,^只能出现在开头(),$只能出现结尾

  • |:或

    • ab|abc优先匹配前面的正则表达式ab,匹配上就不再用后面的abc,可以通过调换顺序修改优先级

  • ^:出现在[]中的^表示除了^后面的其他都匹配

    • [^a]除了a其他都匹配

    • [^a-z]除了小写字母a-z其他都匹配

上面的是匹配单个字符的符号,接下来需要学习匹配个数的限制符号

量词

  • +:我想要匹配13838384388,\d一次只能匹配到一个数字,要想一次讲号码全部匹配上需要用到\d+,+表示重复一次或者多次,并且正则中默认都是贪婪匹配,越多越好

  • *:匹配0次或多次

  • ?:匹配0次或一次

ps:

1.对于这个0次也能匹配出来的结果,暂时不用考虑

2.*,+,?的工作区间可以用坐标轴的形式表示出来

  • {n}:明确指定个数

注意:量词需要写在匹配符号的后面,并且只约束紧挨着它的那个正则表达式

小例子

  • 逐个匹配出后面的道:轨道 通道 地道 魔道 人道

  • 匹配人名:海燕海娇海东

字符集

分组

  • 一次性匹配a1b2c3

    用[a-z][0-9]会匹配到三个结果

    想法:重复写三次,但是太麻烦,加量词的话只能限制离得最近的正则表达式

    这个时候就可以用分组([a-z][0-9])+

  • 匹配身份证号

    依据博客一次分析(下面的正则之所以加^和$是因为我们仅仅只想匹配身份证号,教学演示方便,不加照样也能匹配上,只不过前后可以出现很多其他字符)

    1.^[1-9]\d{13,16}[0-9x]$:不完善的地方在于默认是x的情况只在18位才可能出现,但是这个表达式没有做这一层的限制

    2.^[1-9]\d{14}(\d{2}[0-9x])?$

    3.^([1-9]\d{16}[0-9x]|[1-9]\d{14})$

转义符

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

在python中,无论是正则表达式,还是待匹配的内容,都是以字符串的形式出现的,在字符串中\也有特殊的含义,本身还需要转义。

所以如果匹配一次"\n",字符串中要写成'\\n'

所以如果匹配一次"\\n",字符串中要写成'\\\\n'

简便操作,利用r可以让整个字符串都不再转义(了解:r其实就是real的意思,真实不转义)

贪婪匹配与非贪婪匹配

  • <.*>:先拿着里面的.*去匹配所有的内容,然后再根据>往回退着找,遇到即停止

  • <.*?>:先拿着?后面的>去匹配符合条件的最少的内容,然后把匹配的结果返回

ps:根据匹配的内部原理可以很好的理解

.*?x
就是取前面任意长度的字符,直到一个x出现

至此整个后期项目里面能用到的正则表达式就已经给你讲完了,把这些记住足够你在后面的项目和爬虫中用了

讲了这么久,一点python的事儿都还没扯,现在就要来学在python里面如何使用

re模块使用

三个必须掌握的方法

  • findall

  • search

  • match

import re

# 第一个参数是正则表达式,第二个参数是待匹配的文本内容

ret = re.findall('a', 'eva egon yuan')  # 返回所有满足匹配条件的结果,放在列表里
print(ret)

ret = re.search('a', 'eva egon yuan')  
print(ret.group())  # 结果:'a'
# 函数会在字符串内查找模式匹配,直到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None,并且需要注意的是如果ret是None,再调用.group()会直接报错。这一易错点可以通过if判断来进行筛选
if ret:
print(ret.group())

ret = re.match('a', 'abc').group()  # 同search,不过仅在字符串开始处进行匹配
print(ret)  # ‘a'
# match是从头开始匹配,如果正则规则从头开始可以匹配上,就返回一个对象,需要用group才能显示,如果没匹配上就返回None,调用group()就会报错

其他方法

ret = re.split('[ab]', 'abcd')  # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
print(ret)  # ['', '', 'cd']

ret = re.sub('\d', 'H', 'eva3egon4yuan4', 1)  # 将数字替换成'H',参数1表示只替换1个
print(ret)  # evaHegon4yuan4

ret = re.subn('\d', 'H', 'eva3egon4yuan4')  # 将数字替换成'H',返回元组(替换的结果,替换了多少次)
print(ret)

obj = re.compile('\d{3}')  #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
print(ret.group())  #结果 : 123

import re
ret = re.finditer('\d', 'ds3sy4784a')   #finditer返回一个存放匹配结果的迭代器
print(ret)  # <callable_iterator object at 0x10195f940>
print(next(ret).group())  #查看第一个结果
print(next(ret).group())  #查看第二个结果
print([i.group() for i in ret])  #查看剩余的左右结果

扩展

分组优先机制

import re
res = re.search('^[1-9]\d{14}(\d{2}[0-9x])?$',110105199812067023)
print(res.group())
print(res.group(1))  # 获取正则表达式括号阔起来分组的内容
print(res.group(2))  # search与match均支持获取分组内容的操作 跟正则无关是python机制

# 而针对findall它没有group取值的方法,所以它默认就是分组优先获取的结果
ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
print(ret)  # ['oldboy']     这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可

ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')  # ?:取消分组优先
print(ret)  # ['www.oldboy.com']

补充

import re


ret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>")
#还可以在分组中利用?<name>的形式给分组起名字
#获取的匹配结果可以直接用group('名字')拿到对应的值
print(ret.group('tag_name'))  #结果 :h1
print(ret.group())  #结果 :<h1>hello</h1>
"""
注意?P=tag_name相当于引用之前正则表达式,并且匹配到的值必须和前面的正则表达式一模一样
"""

# 匹配整数
ret=re.findall(r"\d+","1-2*(60+(-40.35/5)-(-4*3))")
print(ret) #['1', '2', '60', '40', '35', '5', '4', '3']

ret=re.findall(r"\d+\.\d*|(\d+)","1-2*(60+(-40.35/5)-(-4*3))")
print(ret) #['1', '2', '60', '', '5', '4', '3']
ret.remove("")
print(ret) #['1', '2', '60', '5', '4', '3']
 

py正则与re模块的更多相关文章

  1. day 18 - 1 正则与 re 模块

    正则表达式 官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个 “规则字符串”,这个 “规则字符串” 用来表达对字符串的一种过滤逻辑. 我 ...

  2. Jupyter notebook导入Pycharm项目的.py文件里的模块及方法

    Jupyter notebook导入Pycharm项目种的.py文件里的模块及方法 需要在Jupyter notebook里调用自己写的代码,过程如下. 首先在Pycharm里写好一个文件,例如DCC ...

  3. python正则以及collections模块

    正则 一.认识模块  什么是模块:一个模块就是一个包含了python定义和声明的文件,文件名就是加上.py的后缀,但其实import加载的模块分为四个通用类别 : 1.使用python编写的代码(.p ...

  4. python 基础之第十二天(re正则,socket模块)

    In [14]: 'hello-wold.tar.gz'.split('.') Out[14]: ['hello-wold', 'tar', 'gz'] In [15]: import re In [ ...

  5. 【py网页】urllib模块,urlopen

    Python urllib 库提供了一个从指定的 URL 地址获取网页数据,然后对其进行分析处理,获取想要的数据. 下面是在 Python Shell 里的 urllib 的使用情况: 01 Pyth ...

  6. Python 正则处理_re模块

    正则表达式 动机 文本处理成为计算机常见工作之一 对文本内容搜索,定位,提取是逻辑比较复杂的工作 为了快速方便的解决上述问题,产生了正则表达式技术 定义 文本的高级匹配模式, 提供搜索, 替换, 本质 ...

  7. pycharm导入本地py文件时,模块下方出现红色波浪线时如何解决

    有时候导入本地模块或者py文件时,下方会出现红色的波浪线,但不影响程序的正常运行,但是在查看源函数文件时,会出现问题 问题如下:  解决方案: 1. 进入设置,找到Console下的Python Co ...

  8. day19 正则,re模块

    http://www.cnblogs.com/Eva-J/articles/7228075.html  所有常用模块的用法 正则的规则: 在一个字符组里面枚举合法的所有字符,字符组里面的任意一个字符和 ...

  9. python 带正则的search 模块

    glob  是python 提供的一个支持正则表达式的查找文件的模块. 实现上采用了os.listdir() 和 fnmatch.fnmatch().  但是没有真的invoking a subshe ...

  10. day23 正则,re模块

    一. 简谈正则表达式 元字符 . 除了换行符外任意字符. \w 数字.字母.下划线 \s 空白符 \b 单词的末尾 \d 数字 \n 匹配换行符 \t 匹配制表符 \W 除了数字. 字母 下划线 \D ...

随机推荐

  1. Mac 创建Python3虚拟环境

    Mac 创建Python3虚拟环境 1.安装virtualenv pip3 install virtualenv 安装virtualenvwrapper pip3 install virtualenv ...

  2. LKWA靶机学习

    LKWA靶机学习 目录 LKWA靶机学习 1 下载地址 2 Blind RCE 2.1 利用Burpsuite Collaborato模块来查看输出. 2.2 尝试利用dnslog进行回显 3 XSS ...

  3. Word 设置页眉、页脚、页码

    页眉:在 Word 文档中,每个页面的顶部区域为页眉.常用于显示文档的附加信息,可以插入时间.图形.公司微标.文档标题.文件名或作者姓名等. 页脚:页脚与页眉的作用相同,都可以作为显示文档的附加信息, ...

  4. PostgreSQL TOAST技术解析

    一.TOAST是什么? TOAST是"The Oversized-Attribute Storage Technique"(超尺寸字段存储技术)的缩写,主要用于存储一个大字段的值. ...

  5. python中的字符串的常用方法介绍

    a = "alxe Li 金角大王"     #创建一个字符串来演示方法的功能结果.一下都使用这个字符串演示. 首先要了解的常识性的知识点是:字符串是不可变的序列.所有对字符串的内 ...

  6. 坏消息,new Date()方法在IOS系统中存在null值情况

    背景介绍 笔者最近在开发小程序,发现在使用new Date()函数在电脑模拟器上倒是没什么影响能很好实现效果,但是在我的Iphone上看到的效果跟预想有出入. 图为在电脑微信小程序模拟器的效果图,可以 ...

  7. 测开-面试题-MySQL

    1 增删改查的关键字分别是什么? 答: insert into \ replace into.delete.update.select 2 内连接和外连接的区别? 答: (1)内连接,只会展示与两表关 ...

  8. 【MySQL 服务器参数优化】

    http://www.hainiubl.com/topics/75823 https://www.cnblogs.com/msjhw/p/15816582.html https://blog.csdn ...

  9. codeforce B. Creating the Contest

    http://codeforces.com/contest/1029/problem/B 水题真快乐= = 1 public class Main { 2 public static void mai ...

  10. iOS开发 性能优化

    1.快 2.稳 3.省 4.小