正则表达式

因为有很多的数据需要使用正则表达式去匹配,一般都是在网上直接搜索一个,但是也是有很多正则表达式是搜索不到的,所以不得不要自己学习一下正则表达式了.这个笔记的学习素材都是来自于胶囊网络,我是害怕自己忘记,所以就写了这个笔记.

1.正则表达式的工具

  • 正则在线测试工具:https://regexr-cn.com/
  • 正则练习网站:https://codejiaonang.com/

2.正则表达式

2.1 字符匹配

表达式: regex=“[Pp]thon”
中括号中的内容可以选择匹配,后面的字符是一定会匹配的。
例如:

Python3
python3
ython

2.2 匹配区间

  • 匹配数字
    表达式: regex=“[0-9]”
  • 匹配小写
    表达式: regex=“[a-z]”
  • 匹配大写
    表达式: regex=“[A-Z]”
  • 匹配大小写
    表达式: regex=“[a-zA-Z]”
    例如匹配字母数字混合体regex=“[0-9a-zA-Z]”

abcdefg&&&
012345678***
987654321%%%
ABCDEFG***

2.3 匹配特殊字符

  • 匹配特殊字符
    表达式: 将表达式使用反斜杠【\】进行转义,就能识别了
    例如匹配下列特殊字符regex=“[][-()]”

[]
()

2.4 取反

如果想匹配除了你要匹配的内容之外的其他内容,可以使用一个^进行取反
例如匹配爱后面不包含你的数据,regex=爱[^你]

爱吗
爱哦
爱我自己
爱了
爱我
我爱你
爱你
爱你爱你
不爱你
爱你一万年

2.5 快捷匹配

  • \w:与任意单词字符匹配,任意单词字符表示 [A-Z]、 [a-z]、[0-9]、_
  • \d:与任意数字匹配
    例如使用快捷方式匹配下列的所有的单词

master
code
jiaonang
123456789
987654321
0123
CODE
JIAONANG
hello world
python

2.6 特殊匹配

  • \s:匹配空白
  • \b:匹配单词的边界
  • ^开头。匹配字符串开头,或者当使用多行标志(m)时,匹配一行的开头。
  • $结尾。匹配字符串结尾,或者当使用多行标志(m)时,匹配一行的结尾。

例如匹配下面有空白的code单词,regex=“code[\s]”

code
code jiaonang
code jiaonang
code www
code jiaonang

例如匹配下列被分割的单词code,regex=“\bcode\b”

code
code jiaonang
code.jiaonang
www.code
code-jiaonang
CODEINFO
codeasd/
codejiaonangA$
JIAONANG-MASTER
CODEJIAONANG!

例如匹配所有的小数,regex=“^\d{1,}.\d{1,}$”

192.168
12.12.12.

所有快捷方式的取反就是将小写变大写就可以了,例如:\W \D \S

2.7匹配开头和结尾

匹配开头用^,匹配结尾用$
例如:匹配以python开头句子,regex=“^python”

python 12344 Python
居家闪客快打python

例如匹配以python结尾的单词,regex=“python$”

python 12344 python
还是说python

2.8 任意字符

匹配任意字符可以用点【.】,但是不能匹配换行符号【\n】,【.*】就是匹配任意字符。
例如匹配任意字符之后但是ar的字符串,regex=“.ar”

ear
car
parked
garage
barked
rar
haarr
in the
ar
aer
acer
ha ha
anr
and

2.9 可选字符

可选字符就是可以匹配也可以不匹配的字符,在这个字符后面加 一个问号,表示可选可不选
例如:有的单词有两种表达方式,需要同时匹配这两种,例如同时匹配employ和employee,regex=“employe?e?”

employe
employee
employ
f

2.10 匹配重复数字

在你要匹配的字符后面加一个花括号,花括号里面填写你要重复的次数,
例如匹配下列的电话号码,regex=\d{3}-\d{5}

010-88480
020-72813
030-12345
020-66666
030-98788
030-88888

123-123
01-72813
0-12345
20-66666
0-98788
0–808888

2.11 匹配区间

在要匹配的字符后面加一个区间{数字1,数字2},一般都会按照最大的那个区间匹配,如果加一个?,表示非贪婪模式,就会按照最小的那个区间去匹配.
例如匹配下面的数字,regex=“\d{8,9}”

4566545223
45664585
4552233

例如:使用正则表达式提取电话号码,假设电话号码有两种规则:

  • 以3个数字开头,后面7个数字,例如:020-7281333
  • 以4个数字开头,后面7个数字,例如:0731-8283431
    regex=“\d{3,4}-\d{7}”

2.12 速写

*逗号:表示0到无穷大

  • 加号:表示1到无穷大
    例如匹配下面任意长度的数字:regex=“\d{1,}”

4566545223
45664585
4552233

例如匹配下列以f开头的数据,regex=“f.+”

f0asd…a123—
food
father
faker
fooder
fufufu

f
brather
brathef
arathef
codejiaonang
mastercode

3.正则表达式进阶

3.1 分组

在你要匹配的数据前后加一个括号就是你要提取的数据

  • 例如:提取学生的电话号码:regex=“(\d{4})-(\d{7})”

张三: 0731-7839932
45664585
4552233

  • 例如提取HTML表达式<div>中的内容:regex=“<div>(.*)</div>”

<div> hi</div>

  • 例如提取学号:
    有些学校的学号是由多个关键信息组成的,例如:2019-5013-08 2019表示入学年份,5013表示班级代码,08表示班级中的排序。
    regex=“(\d{4})[-\s]?(\d{4})[-\s]?(\d{2})”
    其中中间可以是-做分隔,也可以是空格做分隔,也可没有任何分隔,则用[\s-]?表示

2019-5013-08
2019 5013 08
2019501308

3.2 或者条件

用或符号【|】做分割就可以了
例如提取下面.mp4、.avi、.wmv、.rmvb等视频格式
regex=“(.mp4|.avi|.wmv|.rmvb)”

1.avi
abc.mp4
chapter1.wmv
chapter2.rmvb

3.3非捕获分组

有时候,我们并不需要捕获某个分组的内容,但是又想使用分组的特性。
这个时候就可以使用非捕获组(?:表达式),从而不捕获数据,还能使用分组的功能。

例如只要捕获下列的电话号码,但是不要捕获区号regex=“(?:\d{2}|\d{4}|tel)[-:](\d{5})”

01-75855
0731-75855
12345-75855
tel:75855

3.4 分组的回溯引用

因为在识别HTML标签的使用,使用下面的表达式,会识别前后不一致的HTML标签.
例如:regex=“<\w+>(.*?)</\w+>”

# 全部会被识别
123<font>提示</font>abj
123<font>提示</bar>abj

如果使用回溯,就只会识别前后一致的标签
例如:regex=“<(\w+)>(.*?)</\1>”
其中\1代表第一个分组的内容,\2就代表第二个斜杠中的分组

# 就只会识别这衣蛾
123<font>提示</font>abj

3.5 先行断言

很多人也称先行断言和后行断言为环视,也有人叫预搜索,其实叫什么无所谓,重要的是知道如何使用它们!
先行断言和后行断言总共有四种:
正向先行断言
反向先行断言
正向后行断言
反向后行断言

  • 正向先行断言:(?=表达式),指在某个位置向右看,表示所在位置右侧必须能匹配表达式.
    例如匹配喜欢两个字,但是喜欢的后面一个必须是你,regex=“喜欢(?=你”

喜欢你 喜欢他 喜欢我 喜欢 喜欢

  • 反向先行断言(?!表达式)的作用是保证右边不能出现某字符。
    例如匹配喜欢后面没有你的喜欢
    regex=“喜欢(?!你)”

喜欢你 喜欢喜欢我 喜欢 喜欢你

3.6 后行断言

先行断言和后行断言只有一个区别,即先行断言从左往右看,后行断言从右往左看。

  • 正向后行断言:(?<=表达式),指在某个位置向左看,表示所在位置左侧必须能匹配表达式

例如:如果要取出喜欢两个字,要求喜欢的前面有我,后面有你,这个时候就要这么写:(?<=我)喜欢(?=你)。

  • 反向后行断言:(?<!表达式),指在某个位置向左看,表示所在位置左侧不能匹配表达式

例如:如果要取出喜欢两个字,要求喜欢的前面没有我,后面没有你,这个时候就要这么写:(?<!我)喜欢(?!你)。

4.正则表达式的案例

4.1 匹配所有手机号码

手机号码的规则:

  • 以数字1开头
  • 第2位只能是345678
  • 长度为11位
    得到正则表达式为:regex=“^1[345678]\d{9}”

4.2 判断密码中是否有数字大小写字母

  • 判断数字:regex=“(?=.*?[0-9])”
  • 判断大写regex=“(?=.*?[a-z])”
  • 判断小写regex=“(?=.?[A-Z])"
    得到正则表达式为:regex="(?=.
    ?[a-z])(?=.?[A-Z])(?=.?[0-9]).+”
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值