小菜升級筆記之手擼正則表達式——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

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