日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > HTML >内容正文

HTML

Python正则表达式(正则、regular、re)讲解,及常用正则:匹配邮箱、身份证、手机号、IP地址、URL、HTML等

發布時間:2024/1/1 HTML 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python正则表达式(正则、regular、re)讲解,及常用正则:匹配邮箱、身份证、手机号、IP地址、URL、HTML等 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正則表達式(正則、regular、re)是 Python 中最常見的編程技巧,很多時候,一個好的正則表達式可以抵上幾十行代碼。比如:匹配(校驗)郵箱、身份證、手機號、IP地址、URL、HTML等。

正則表達式,其實就是一串特殊的字符序列,而這串字符序列蘊含著事先定義好的 模式 (規則),可以用于匹配、校驗其它的字符串(文本、網頁等)。

但想掌握正則表達式的難度在于,其包括了較多的 基礎模式語法 需要記憶,并且這些基礎模式語法可以進行組合,產生無窮的變化。

所以,不建議死記硬背正則的基礎模式語法,可以隨用隨查,使用多了,自然就會形成機械記憶了。

基礎模式語法

** 字符范圍匹配**

正則表達式說明正確錯誤
A精準匹配單個字符Aa
x|y允許出現的2個字符yn
[xyz]字符集合,允許出現集合內任意單個字符zc
[a-z] [A-Z] [0-9]字符范圍a D 8A a A
[^xyz] [^0-9]集合內字符不允許出現0 Ay 8

元字符

正則表達式說明正確錯誤
\d匹配任意單個數字8i
\D匹配\d規則之外的任意單個字符i8
\w匹配任意單個字母數字下劃線Y&
\W匹配\w之外的任意單個字符&Y
\s匹配單個空格x
\n匹配單個換行符x
.匹配任意單個字符(換行符除外)
\.特殊字符,只匹配..1

多次重復匹配

正則表達式說明正確錯誤
A{3}精準N次匹配AAAAA
A{3,}最少出現N次AAAAA
\d{3,5}約定出現最少次數與最大次數123412
\d*可以出現零次至無限次,相當于{0,}1234
\d+最少出現一次,相當于{1,}12
\d?最多出現一次,相當于{0,1}112

定位匹配

正則表達式說明正確錯誤
^A.*頭匹配ABCCBA
.*A$尾匹配CBAABC
^A.*A$全字匹ACCCAACCC

正則匹配流程


在正則匹配之前,需要先將正則表達式編譯成正則表達式對象。所以,一個頻繁使用的正則表達式會事先完成編譯,以提高執行效率。

import re# 密碼強度的正則表達式 re_password = re.compile(r'^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$')

同時在 re.compiler(pattern[, flags]) 時,可選正則表達式的修飾符,來控制匹配的模式。

具體如下表所示:

修飾符描述
re.I使匹配對大小寫不敏感
re.L做本地化識別(locale-aware)匹配
re.M多行匹配,影響 ^ 和 $
re.S使 . 匹配包括換行在內的所有字符
re.U根據Unicode字符集解析字符。這個標志影響 \w, \W, \b, \B
re.X該標志通過給予你更靈活的格式以便你將正則表達式寫得更易于理解

匹配

re.match(pattern, string, flags=0)

從字符串的起始位置匹配,如果不能起始位置匹配成功的話,則返回 None,這一點需要我們特別注意。

其中參數 flags 就是正則表達式的修飾符。

import reprint(re.match(r'hello', 'Hello world', re.I)) print(re.match(r'world', 'Hello world', re.I))<_sre.SRE_Match object at 0x7f2c7c626648> None

re.search(pattern, string, flags=0)

與 match 方法不同,它可以掃描整個字符串,并返回第一成功的匹配。

import reprint(re.search(r'hello', 'Hello world', re.I)) print(re.search(r'world', 'Hello world', re.I))<_sre.SRE_Match object at 0x7fbcf9945648> <_sre.SRE_Match object at 0x7fbcf9945648>

可以看到,search 方法成功找到了 world 字符串。

如果我們想輸出匹配的結果,可以使用 group 和 groups。

import reprint(re.search(r'world', 'Hello world', re.I).group(0)) print(re.search(r'(world)', 'Hello world', re.I).groups())world ('world',)

這里有一個知識點就是 () 在正則表達式中應用給 groups 。

還有一點需要特別說明, 正則表達式匹配默認是 貪婪匹配

import reprint(re.match(r'^(\d+)(0*)$', '102300').groups()) print(re.match(r'^(\d+?)(0*)$', '102300').groups())('102300', '') ('1023', '00')

由于\d+ 采用貪婪匹配,直接把后面的 0 全部匹配了,結果 0* 只能匹配空字符串了。

必須讓 \d+ 采用非貪婪匹配(也就是盡可能少匹配),才能把后面的 0 匹配出來,加個 ? 就可以讓 \d+ 采用。

match 和 search 只能匹配一次,如果想匹配所有,那么可以使用 findall 和 finditer 。

findall(string[, pos[, endpos]]

import re# 匹配數字 pattern = re.compile(r'\d+') result1 = pattern.findall('runoob 123 google 456') result2 = pattern.findall('run88oob123google456', 0, 10)print(result1) print(result2)['123', '456'] ['88', '12']

finditer(pattern, string, flags=0)

import re# 匹配數字 it = re.finditer(r"\d+","12a32bc43jf3") for match in it: print (match.group())12 32 43 3

除了單純的匹配之外,還會有 分割替換 的需求,所以下面介紹這兩種方法:

re.split(pattern, string[, maxsplit=0, flags=0])

import re print(re.split('\W+', 'runoob, runoob, runoob.'))['runoob', 'runoob', 'runoob', '']

re.sub(pattern, repl, string, count=0, flags=0)

import redt = '2020-01-01' print(re.sub(r'\D', ' ', dt))2020 01 01

常用正則表達式

  • 校驗密碼強度: ^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
  • 校驗中文:^[\\u4e00-\\u9fa5]{0,}$
  • 有數字、26個英文字母或下劃線組成的字符串: ^\\w+$
  • 校驗Email地址: [\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?
  • 校驗身份證號碼
    15位: ^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$
    18位: ^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$
  • 校驗手機號: ^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\\d{8}$
  • IP地址:
    v4: \\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b
    v6: (([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))
  • 提取頁面超鏈接: (<a\\s*(?!.*\\brel=)[^>]*)(href="https?:\\/\\/)((?!(?:(?:www\\.)?'.implode('|(?:www\\.)?', $follow_list).'))[^"]+)"((?!.*\\brel=)[^>]*)(?:[^>]*)>
  • 校驗日期: ^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$
  • 校驗金額: ^[0-9]+(.[0-9]{2})?$
  • 最后,安利大家一本書《深入理解NLP的中文分詞:從原理到實踐》,讓你從零掌握中文分詞技術,踏入NLP的大門。

    如果因為以上內容對你有所幫助,希望你能幫個忙,點個贊、評個論、轉個發,關個注。

    此公眾號每周分享一篇干貨文章,實實在在把一個課題說明白,講清楚,望關注!

    總結

    以上是生活随笔為你收集整理的Python正则表达式(正则、regular、re)讲解,及常用正则:匹配邮箱、身份证、手机号、IP地址、URL、HTML等的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。