小菜升级笔记之手撸正则表达式——Python & JavaScript

听说,能手撸正则表达式的都不算坑,小菜加油ing~


简述

元字符

前瞻与后顾

         主要函数

具体实例

校验email地址

校验手机号码

校验身份证号(校验日期格式)

校验密码强度

匹配空格

前瞻与后顾

贪婪与懒惰

注意事项

相关资料


简述

元字符

引自:https://www.imooc.com/learn/1218

前瞻与后顾

主要函数

Python

1、re.match()
尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。re.match(pattern, string, flags=0)

2、findall()
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。findall(string[, pos[, endpos]])

3、re.finditer()
和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。re.finditer(pattern, string, flags=0)

4、re.search()
re.search 扫描整个字符串并返回第一个成功的匹配。re.search(pattern, string, flags=0)

5、re.match与re.search的区别:
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

内容引自:https://www.runoob.com/python/python-reg-expressions.html

JavaScript

1、使用字符串方法:

在 JavaScript 中,正则表达式通常用于两个字符串方法 : search() 和 replace()。

(1)search() 方法 用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,并返回子串的起始位置。

(2)replace() 方法 用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。

2、使用 RegExp 对象:

在 JavaScript 中,RegExp 对象是一个预定义了属性和方法的正则表达式对象。

(1)test() 方法 用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。

(2)exec() 方法 用于检索字符串中的正则表达式的匹配。该函数返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。

内容引自:https://www.runoob.com/js/js-regexp.html

具体实例

校验email地址

一般格式:数字/字母 + @ + 数字/字母(2~7) + . + 字母(2~5)。

Python

string = r"[email protected]"

reguExpr = r"^\w+@\w{2,7}\.[a-zA-Z]{2,5}$"
comResult = re.compile(reguExpr)
print(comResult.findall(string))

JavaScript

var string = "[email protected]";

var reguExpr = /^\w+@\w{2,7}\.[a-zA-Z]{2,5}$/;
console.log(reguExpr.test(string));
console.log(reguExpr.exec(string));

运行结果

校验手机号码

一般格式:首位为1;其余为数字;长度为11。

Python

string = r"15823074969"

reguExpr = r"^1[0-9]+$"
comResult = re.compile(reguExpr)
print(comResult.findall(string))

JavaScript

var string = "15823074969";

var reguExpr = /^1[0-9]+$/;
console.log(reguExpr.test(string));
console.log(reguExpr.exec(string));

运行结果

校验身份证号(校验日期格式)

格式:

# 身份证号(15位/18位, 最后有一位校验码)
# 18位: 6位地区码 + 8位出生年月 + 3位顺序码 + 1位校验码
# 15位: 6位地区码 + 6位出生年月 + 2位顺序码 + 1位校验码
# 规则1: 除了校验码全部为数字
# 规则2: 首位地区码不是0
# 规则3: 中间出生年月为日期
# 规则4: 校验码可以是数字和字母x

Python

string = r"21011219951008982X"

reguExpr = r"(^[1-9]\d{5}(19|(2\d))[0-9]{2}((0\d)|10|11|12)((0\d)|1\d|2\d|30|31)\d{3}[\dxX]$)" \
           r"|(^[1-9]\d{7}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}[0-9xX]$)"

# 其他正则表达方法
# reguExpr = r"(^[1-9]\d{5}(18|19|(2\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9xX]$)"

# 捕获组(使用finditer()的方法)
comResult = re.compile(reguExpr)
objs = comResult.finditer(string)
list = []
for obj in objs:
    list.append(obj.group())
print(list)

JavaScript

var string = "21011219951008982X";

var reguExpr = /^[1-9]\d{5}(19|(2\d))[0-9]{2}((0\d)|10|11|12)((0\d)|1\d|2\d|30|31)\d{3}[\dxX]$/;
console.log(reguExpr.test(string));
console.log(reguExpr.exec(string));

运行结果

校验密码强度

格式:不少于6位;包含大小写字母和数字,大写字母开始;不长于16位。

Python

string = r"ArcErf12333"

reguExpr = r"^[A-Z]\w{5,16}$"
comResult = re.compile(reguExpr)
print(comResult.findall(string))

JavaScript

var string = "ArcErf12333";

var reguExpr = /^[A-Z]\w{5,16}$/;
console.log(reguExpr.test(string));
console.log(reguExpr.exec(string));

运行结果

匹配空格

Python

string = r"apple and at head"

reguExpr = r"[ ]"
# reguExpr = r" "
comResult = re.compile(reguExpr)
print(comResult.findall(string))

JavaScript

var string = "apple and at head";

// var reguExpr = /[ ]/;
var reguExpr = / /;
console.log(reguExpr.test(string));
console.log(reguExpr.exec(string));

运行结果

前瞻与后顾

Python

string = r"<h1>Good morning, coder!</h1>"

# reguExpr = r"[^<h1>].+[^</h1>]" # 非前瞻与后顾
reguExpr = r"(?<=<h1>).+(?=</h1>)" # 前瞻与后顾
comResult = re.compile(reguExpr)
print(comResult.findall(string))

JavaScript

var string = "<h1>Good morning, coder!</h1>";

// var reguExpr = /[^<h1>].+[^</h1>]/; // 非前瞻与后顾
var reguExpr = /(?<=<h1>).+(?=<\/h1>)/; // 前瞻与后顾
console.log(reguExpr.test(string));
console.log(reguExpr.exec(string));

运行结果

贪婪与懒惰

Python

# 贪婪匹配
string = r"<h1>Good morning, coder! @Good morning, coder! Good morning, coder!</h1>"

reguExpr = r"@.+!"
comResult = re.compile(reguExpr)
print(comResult.findall(string))

# 惰性匹配
string = r"<h1>Good morning, coder! @Good morning, coder! Good morning, coder!</h1>"

reguExpr = r"@.+?!"
comResult = re.compile(reguExpr)
print(comResult.findall(string))

JavaScript

// 贪婪
var string = "<h1>Good morning, coder! @Good morning, coder! Good morning, coder!</h1>";

var reguExpr = /@.+!/;
console.log(reguExpr.test(string));
console.log(reguExpr.exec(string));

// 惰性
var string = "<h1>Good morning, coder! @Good morning, coder! Good morning, coder!</h1>";

var reguExpr = /@.+?!/;
console.log(reguExpr.test(string));
console.log(reguExpr.exec(string));

运行结果

贪婪:

惰性:

注意事项

1、Python正则表达式需要导入包(一般已自带,不用安装):

import re

2、针对同一需求,正则表达式并不唯一,不同表达式也可能实现同样的结果;

3、看到有大神说,其实python的re.compile(reguExpr)在这里使用挺多余的,因为findall()/re.match()/re.finditer()/re.search()这几个方法就已经包括了compile这一步,详见:https://zhuanlan.zhihu.com/p/70680488
由于我看到这篇文章的时候已经写好了代码,偷个小懒就没有改。具体修改方法举例:

有re.compile()的代码:

string = r"[email protected]"

reguExpr = r"^\w+@\w{2,7}\.[a-zA-Z]{2,5}$"
comResult = re.compile(reguExpr)
print(comResult.findall(string))

没有re.compile()的代码:

string = r"[email protected]"

reguExpr = r"^\w+@\w{2,7}\.[a-zA-Z]{2,5}$"
#不用compile的方法
print(re.findall(reguExpr,string))

4、Python和JavaScript的正则表达式可以通用,但需要将Python中的    r"..."    修改为    /.../;   (记得不要忘记分号)。

相关资料

Python帮助文档:https://www.runoob.com/python/python-reg-expressions.html

JavaScript帮助文档:https://www.runoob.com/js/js-regexp.html

教程资料:https://www.imooc.com/learn/1218

re.compile()函数说明:https://zhuanlan.zhihu.com/p/70680488

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章