当前位置: 澳门新濠3559 > 编程 > 正文

正则表达式(Regular,来确定一个字符串是否符合规

时间:2019-12-08 22:39来源:编程
正则语法 每天一句:梦想不是挂在嘴边炫耀的空气,而是需要认真的实践,等到对的风,我们展翅翱翔;没有风,只要拥有足够强壮的翅膀,我们照样拔地飞行,天空见面。 一、正则

  

正则语法

每天一句:梦想不是挂在嘴边炫耀的空气,而是需要认真的实践,等到对的风,我们展翅翱翔;没有风,只要拥有足够强壮的翅膀,我们照样拔地飞行,天空见面。

一、正则表达式

 1. 什么是正则表达式:

一、什么是正则

1、正则表达式:专门用来验证字符串的一种规则,我们想要的验证的规则,然

后通过相关的方法,让这个正则去验证指定的字符串,并返回我们希望的结果。

2、正则表达式是一种单独的语法,与使用环境的开发语言无关,(任何开发环

境中都可以使用正则)

一、正则表达式基础1

  • 复习字符串操作
    search 查找
    substring 获取子字符串
    charAt 获取某个字符
    split 分割字符串,获取数组

  • 找出字符串中所有数字
    1、用传统字符串操作完成
    2、用正则表达式完成

1.正则表达式概述

  正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。正则表达式是烦琐的,但它是强大的,学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感。

    一种匹配字符串的规则

二、如何创建一个正则表达式

1、构造函数创建一个正则表达式

var regExp=new RegExp("[0-9]","g");

1)、第一个参数是正则表达式的主体内容;

2)、第二个参数是正则的修饰符。

2、使用字面量创建正则

var regExp=/[0-9]/g;

两个斜杠之间是正则主体,最后一个斜杠后是正则修饰符

二、正则表达式基础2

  • 什么是正则表达式
    1、什么叫"正则" --> 规则、模式
    2、强大的字符串匹配工具
    3、是一种正常人很难读懂的文字

  • 正则表达式(RegExp)
    1、js风格 —> new RegExp("a", "b")
    2、perl风格 —> /a/i

  // 参数1: 检测字符串是否包含'a'
  // 参数2: 'i'表示忽略大小写
  var re = new RegExp('a');
  var re = new RegExp('a','i');

  // 简写
  var re = /a/;
  var re = /a/i;

2.表达式列表

 

表达式

说明

字符匹配

[0-9]

匹配0-9之间的任意1个数字。

[a-z]

表示某个范围内的字符。与指定区间内的任何字符匹配。例如,"[a-z]"匹配"a"与"z"之间的任何1个小写字母。

[A-Z]

表示某个范围内的字符。与指定区间内的任何字符匹配。例如,"[澳门新濠3559,A-Z]"匹配"A"与"Z"之间的任何1个大写字母。

元字符匹配

.

匹配换行符以外的任何字符。

w

与任何单词字符匹配,包括下划线。等价于"[A-Za-z0-9_]"。

s

与任何白字符匹配,包括空格、制表符、分页符等。等价于"[fnrtv]"。

d

与一个数字字符匹配。等价于[0-9]。

n

与换行符字符匹配。

t

与制表符匹配。

b

与单词的边界匹配,即单词与空格之间的位置。例如,"erb"与"never"中的"er"匹配,但是不匹配"verb"中的"er"。

^

匹配输入的开始位置。

$

匹配输入的结尾。

W

与任何非单词字符匹配。等价于"[^A-Za-z0-9_]"。

D

与非数字的字符匹配。等价于[^0-9]。

S

与任何非空白的字符匹配。等价于"[^fnrtv]"。

x|y

匹配x或y。例如"z|food"可匹配"z"或"food"。"(z|f)ood"匹配"zood"或"food"。

()

群组,与模式匹配并记住匹配。匹配的子字符串可以从作为结果的Matches集合中使用Item[0]... [n]取得。如果要匹配括号字符(和),可使用"("或")"。

[xyz]

一个字符集。与括号中字符的其中之一匹配。例如,"[abc]"匹配"plain"中的"a"。

[^xyz]

一个否定的字符集。匹配不在此括号中的任何字符。例如,"[^abc]"可以匹配"plain"中的"pl".

量词

*

正则表达式(Regular,来确定一个字符串是否符合规则或者从大段的字符串中。匹配前一个字符零次或几次。例如,"zo*"可以匹配"z"、"zoo"。

+

匹配前一个字符一次或多次。例如,"zo+"可以匹配"zoo",但不匹配"z"。

?

匹配前一个字符零次或一次。例如,"a?ve?"可以匹配"never"中的"ve"。

{n}

n为非负的整数。匹配恰好n次。例如,"o{2}"不能与"Bob中的"o"匹配,但是可以与"foooood"中的前两个o匹配。

{n,}

n为非负的整数。匹配至少n次。例如,"o{2,}"不匹配"Bob"中的"o",但是匹配"foooood"中所有的o。"o{1,}"等价于"o+"。"o{0,}"等价于"o*"。

{n,m}

m和n为非负的整数。匹配至少n次,至多m次。例如,"o{1,3}"匹配"fooooood"中前三个o。"o{0,1}"等价于"o?"。

 2. 正则表达式能作甚莫

三、如何用正则去验证字符串

1、使用正则对象下的方法调用正则(正则方法的调用者是正则对象,方法参数

是要验证的字符串)

1)、test()方法:如果找到正则中匹配的字符,返回true;参数是

要验证的字符串。

var regExp=/ea/;

var str="read";

alert(regExp1.test(str));

2)、exec()方法:搜索字符串中符合正则规则的字符,并把第一个匹

配的字符返回出来,如果没有返回null。

var regExp=/ea/;

var str="read";

alert(regExp1.exec(str));

2、字符串对象下的正则验证方法(方法中既可以是字符串,也可以是正则表达式

)。

1)、search():字符串下的方法,找到参数指定的字符并返回下标

,如果没找到,就返回-1,参数可以是字符串,也可以是正则表达式。

var str="read";

alert( str.search(/a/) );

2)、replace('','');根据正则表达式进行查找替换,例如:敏感词替

换。

var str="read";

alert(str2.replace(/e|d/g,'***'));

3)、match():找到匹配字符并返回

var str="read";

alert(str3.match(/e/g));

三、字符串与正则配合

  • search(搜索) 字符串搜索
    1、返回出现的位置(不存在返回-1)
    2、忽略大小写: i (ignore)
    3、判断浏览器类型

  • match(匹配) 获取匹配的项目
    1、量词: + (表多个)
    2、量词变化: d、dd、d+
    3、全局匹配: g (global)
    (例如: 找出所有数字)

  • replace(替换) 替换所有匹配
    1、返回替换后的字符串
    (例如: 敏感词过滤)

3.表达式的应用区别

(1).^${}的区别

正则 待匹配字符 匹配
结果
说明
李.? 李杰和李莲英和李二棍子

李杰
李莲
李二

 
?表示重复零次或一次,即只匹配"李"后面一个任意字符
 
李.* 李杰和李莲英和李二棍子 李杰和李莲英和李二棍子
*表示重复零次或多次,即匹配"李"后面0或多个任意字符
李.+ 李杰和李莲英和李二棍子 李杰和李莲英和李二棍子
+表示重复一次或多次,即只匹配"李"后面1个或多个任意字符
李.{1,2} 李杰和李莲英和李二棍子

李杰和
李莲英
李二棍

{1,2}匹配1到2次任意字符

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

正则 待匹配字符 匹配
结果
说明
李.*? 李杰和李莲英和李二棍子

惰性匹配

(2)字符集[ ] [ ^ ]

正则 待匹配字符 匹配
结果
说明
李[杰莲英二棍子]* 李杰和李莲英和李二棍子

李杰
李莲英
李二棍子

 
表示匹配"李"字后面[杰莲英二棍子]的字符任意次
 
李[^和]* 李杰和李莲英和李二棍子

李杰
李莲英
李二棍子

表示匹配一个不是"和"的字符任意次
[d] 456bdha3

4
5
6
3

表示匹配任意一个数字,匹配到4个结果
[d]+ 456bdha3

456
3

表示匹配任意个数字,匹配到2个结果

(3)转移符

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

  在python中,无论是正则表达式,还是待匹配的内容,都是以字符串的形式出现的,在字符串中也有特殊的含义,本身还需要转义。所以如果匹配一次"d",字符串中要写成'\d',那么正则里就要写成"\\d",这样就太麻烦了。这个时候我们就用到了r'd'这个概念,此时的正则是r'\d'就可以了。

正则 待匹配字符 匹配
结果
说明
d d  False
因为在正则表达式中是有特殊意义的字符,所以要匹配d本身,用表达式d无法匹配
\d d  True
转义之后变成\,即可匹配
"\\d" '\d'  True
如果在python中,字符串中的''也需要转义,所以每一个字符串''又需要转义一次
r'\d' r'd'  True
在字符串之前加r,让整个字符串不转义

 

(4)贪婪匹配

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

正则 待匹配字符 匹配
结果
说明
<.*>

<script>...<script>

<script>...<script>
默认为贪婪匹配模式,会匹配尽量长的字符串
<.*?> r'd'  

<script>
<script>

加上?为将贪婪匹配模式转为非贪婪匹配模式,会匹配尽量短的字符串
几个常用的非贪婪匹配模式

*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复

.*?的用法

. 是任意字符
* 是取 0 至 无限长度
? 是非贪婪模式。
何在一起就是 取尽量少的任意字符,一般不会这么单独写,他大多用在:
.*?x

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

    制定一个规则,来确定一个字符串是否符合规则或者从大段的字符串中,找到符合规则的

四、正则语法规则

1、修饰词

1)、i  --匹配时忽略大小

2、g  --执行时全局匹配

2、小括号()为字符组合

1)、(abc)  --查找abc这个单词

2)、(ab|df|sd)  --查找ab、df、sd这三个中其中一个。  “|”表

示或

3、中括号

1)、[12345]  --包括1、2、3、4、5其中的某一个

2)、[0-9]  --包括所有数字

3)、[abc]  --包括a、b、c其中的一个

4)、[a-z]  --包括所有的小写字母

5)、[A-Z]  --包括所有的大写字母

6)、[A-z]  --包括所有的字母

7)、[0-9a-z]  --包括所有的数字和小写字母

8)、[^ab]  --除了字符ab

4、元字符

1)、.  --代表任何的字符    注意:如果需要加  .  的时候,需要

进行转义。

2)、w  --任何字母、数字、下划线

3)、W  --任何非字母、数字、下划线

4)、d  --任何数字

5)、D  --任何非数字

6)、s  --空白字符

7)、S  --非空白字符

8)、b  --查找单词边界

9)、B  --查找非单词边界

(了解的:o  --查找NULL字符;n  --查找换行符;f  --查找分页

符;r  --查找回车符;t  --查找制表符;v  --查找垂直制表符。)

5、量词

1)、^n  --匹配开头为n的字符串

2)、n$  --匹配结尾为n的字符串

3)、n+  --匹配任何包含至少一个n的字符串

4)、n{x}  --匹配任何包含x个n的字符串

5)、n{x,y}  --匹配包含x到y个n的字符串

(了解:n*  --匹配任何包含0个或者多个n的字符串;n?  --匹配任

何包含0个或1个n的字符串;?!n  --匹配任何其后没有紧接字符串n的字符串

(推荐一个工具网站:

四、字符类

【在方括号中的,都是单个字符的,不管是里面是什么】

  • 任意字符 [abc]
    例如: o[abc] —> oa/ob/oc

  • 范围 [a-z]、[0-9]
    例如: 班级[0-9] —> 班级1/班级2..班级9

  • 排除 [^a] (除了a以外的都可以)
    例如: ab[^0-9] — abd/ab?/ab …

  • 组合 [a-z0-9A-Z] (字母和数字)

  • 转义字符
    1、 .(点) —> 表示任意字符
    ' . ' 点表示所有字符
    ' .+ ' 表示许多个任意字符
    2、d —> 表示[0-9],即数字
    3、D —> 表示[^0-9],即除了数字
    4、w —> 表示[a-zA-Z0-9_],即数字字母下划线
    5、W —> 表示[^a-zA-Z0-9_],即除了数字字母下划线
    6、s —> 表示空白空格制表符
    7、S —> 除了空格以外的
    【如果就是需要输入点这个字符,请进行转义 “.” 】

案例: 将小说转换过来

 rel = /<[^<>]+>/g;     str.replace(rel, ‘’);

二、RE模块

    内容

五、量词

  • 什么是量词
    1、出现的次数
    2、{n,m}至少出现n次,最多m次
    例如: 查找QQ号

  • 常用量词
    1、{n,} 至少n次
    2、* 任意次(可以出现也可以不出现,不建议使用 {0,}
    3、? 零次或一次 {0,1}
    4、+ 一次或任意次 {1,}
    5、{n} 正好n次

1.re函数方法总结

方法名称   格式             说明
findall re.findall(表达式,字符串)
返回所有满足匹配条件的结果,放在列表里
search re.search(表达式,字符串).groups()
函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以
通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
match      re.match(表达式,字符串).groups()    同search,不过尽在字符串开始处进行匹配
split    re.split(表达式,字符串)    按表达式对字符串分割,返回列表
sub re.sub(表达式,替换字符,字符串,count)
按表达式类型替换成新的字符,返回字符串
subn re.subn(表达式,替换字符,字符串,count)
按表达式类型替换成新的字符串,返回一个元组,存放这替换结果和替换次数
compile re.compile(表达式)
将正则表达式编译成为一个 正则表达式对象
finditer re.finditer(表达式,字符串)
finditer返回一个存放匹配结果的迭代器

    登录注册表单验证 ; 爬虫 ; 自动化开发 ; 日志开发

六、高级表单校验

  • 校验邮箱
    1、行首行尾 (^行首,$行尾,一般的校验都需要加上这,避免只有一部分符合规则)
/^w+@[0-9a-z]+.[a-z]{2,4}$/

2、去掉空格

 ^s*|s*$
  • 匹配中文: [u4e00-u9fa5]

 2.常用方法实例

#(1)findall
import re
ret = re.findall('d','adsf123456we7we')    #匹配字符串中是数字的字符,并将匹配值返回到列表中
print(ret)
'''结果:
['1', '2', '3', '4', '5', '6', '7']
'''

#(2)search
ret = re.search('d','adsf123456we7we').group()     #按照表达式匹配到第一个值就返回
print(ret)
'''结果:
1
'''

#(3)match
ret = re.match('w','adsf123456we7we').group()  #按照表达式匹配开头第一个值,符合的话就返回,不符合就报错
print(ret)
'''结果:
a
'''

#(4)sub
ret = re.sub('d','*','adsf123456we7we',0)      #匹配字符串中的数字,并且替换成*号,0表示替换所有
print(ret)
'''结果:
adsf******we*we
'''

#(5)subn
ret = re.subn('d','*','adsf123456we7we',0)     #匹配字符串中的数字,并且替换成*号,返回一个元组,存放这替换结果和替换次数
print(ret)
'''结果:
('adsf******we*we', 7)
'''

#(6)compile
obj = re.compile('d')  #将正则表达式编译成一个正则表达式对象
ret = obj.search('ads123asd456').group()
print(ret)
'''结果:
1
'''

#(7)finditer
ret = re.finditer('d','adsf451we15615adf16')   #finditer返回一个存放匹配结果的迭代器
print(ret)
for i in ret:
    print(i.group())

 

 3. 正则表达式语法

   元字符:

    字符组 [ ]  在一个字符的位置上能出现的内容

      [0-9] 表示这一位置上只匹配0到9之间的一个数字

     [A-Z] 表示这一位上只能匹配A到Z之间的一个大写字母(Python根据ascii码的顺序确

      定A-Z的先后范围)

     [a-z] 表示这一位上只能匹配a到z之间的一个小写字母(Python根据ascii码的顺序确

      定a-z的先后范围)

     [0-9][A-Z][a-z]表示匹配三个字符,且按照顺序满足每一位置上的条件

     [0-9a-zA-Z]  标识匹配一个字符,满足每一范围的条件.但是没有顺序限制

     [^abc] 非字符组 在此种情况,^ 相当于'非', 与[ ]所对应的位置不允许有[ ]内的内容

    

    d  表示匹配一个字符,匹配的是一个数字

    w  表示匹配一个数字字母下划线

    s  标识匹配任意一个空白字符(回车 / n,空格,制表符 / tab)

    n  表示匹配回车

    t  表示匹配制表符

    D  匹配非数字

    W  匹配非数字字母下划线

    S  匹配非空白字符

    [dD] [sS] [wW]  表示匹配所有

    .  匹配除换行符以外的任意字符

    b  匹配一个单词的边界   ob  表示只匹配以o结尾的边界  bo 表示匹配以o开始的边界

    ^  匹配字符串的开始

    $ 匹配字符串的结尾

澳门新濠3559 1                                 澳门新濠3559 2

 

    |    表示可以匹配 | 左右的字符都可以( ' 或 ' 的意思)

       abc|ab   'abc'和'ab'都可以 ; 

      ab|abc   只有ab可以,(从左往右查找,找到就停止,所以只找'ab',不再往下找)

 

    ()  分组 

  

  量词 ?  +  *  {}

   ?   表示 0 次或1 次  + 表示 1 次或多次  * 表示 0 次或多次

   {n}  表示 n 次  {n,}   n 次以上  {n,m}   n 到 m 次

   元字符和量词结合 , 表示在同一位置可以陪配多个

 回溯算法  (用回溯算法完成贪婪匹配)

澳门新濠3559 3

 

  特殊的用法和现象

   ? 的使用

    在量词后面加个 ? (??  +?   *?)取消贪婪匹配(尽可能多的匹配) 变成惰性

    匹配(尽可能少的匹配)

编辑:编程 本文来源:正则表达式(Regular,来确定一个字符串是否符合规

关键词: