聽說,能手擼正則表達式的都不算坑,小菜加油ing~
簡述
元字符
引自: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