python學習--re模塊

一、結合match匹配任意字符串

(一)匹配單個字符串

字符 功能
. 匹配任意1個字符(除了\n)
[ ] 匹配[ ]中列舉的字符
\d 匹配數字,即0-9
\D 匹配非數字,即不是數字
\s 匹配空白,即 空格,tab鍵
\S 匹配非空白
\w 匹配單詞字符,即a-z、A-Z、0-9、_
\W 匹配非單詞字符

(二)匹配多個字符串

字符 功能
* 匹配前一個字符出現0次或者無限次,即可有可無
+ 匹配前一個字符出現1次或者無限次,即至少有1次
? 匹配前一個字符出現1次或者0次,即要麼有1次,要麼沒有
{m} 匹配前一個字符出現m次
{m,n} 匹配前一個字符出現從m到n次

(三)匹配開頭和結尾

字符 功能
^ 匹配字符串開頭
$ 匹配字符串結尾

(四)匹配一手機號 (不是以4、7結尾的手機號碼(11位))

import re
tel_num = '13411331125'
re_obj = re.compile(r"1[34578][0-9]{8}[0-35-68-9]$")
match_tel_num = re_obj.match(tel_num)
print match_tel_num.group()

(五)匹配一個郵箱 (匹配出163的郵箱地址,且@符號之前有4到20位,例如[email protected]

import re
email = "[email protected]"
# 1、郵箱地址以大小寫字母,數字,下劃槓組成
# 2、而\w裏面還包括漢子,所以不能用。
# 3、{m,n}之間,後面不能有空格
# 4、郵箱地址的.得用\轉義,否則按任意字符算
# 5、如果在.com後面不跟上$那麼com後還有字符串得情況也同樣匹配
match_email = re.match("[a-zA-Z0-9_]{4,20}@163\.com$", email)
print(match_email.group())

(六)匹配0-100之間的數字

import re
num = input("請輸入一個0-100之間的數字:")
# 1、0-100首先十位輸爲1-9
# 2、10-99個位上得數爲0-9
# 3、因爲有一位數和兩位數,所以十位數可以判定位可取可不取得
# 4、被匹配得對象必須爲字符串類型
# 5、如果大部分條件滿足,只有一部分不滿足,那麼可以用 |
# 6、一般情況下不要隨便加空格,也算一個字符
match_num = re.match("[1-9]?[0-9]$|100", num)
if match_num:
    print("%s是0-100之間得數字。" % match_num.group())
else:
    print("%s不是0-100之間得數字。" % num)

二、匹配分組的用法

(一)匹配分組

字符 功能
| 匹配左右任意一個表達式
(ab) 將括號中字符作爲一個分組
\num 引用分組num匹配到的字符串
(?P) 分組起別名
(?P=name) 引用別名爲name分組匹配到的字符串

(二)匹配163,126,qq郵箱

import re
email_list = ["[email protected]", "a124223434.com", "[email protected]", "[email protected]"]
# 1、如果qq後面不用()分組得話,那麼匹配不出來
# 2、我們應該分組來處理各種類型得郵箱.
# 3、如果在撇配多個郵箱得時候,我們只需要用 | 分割出各種可能得情況
# 4、如果我們匹配到了郵箱,想看下是什麼類型得郵箱用group(1)這個1指的是第一組
# 5、group(n)裏得參數意味着獲取第幾組數據
for email in email_list:
    match_email = re.match("[0-9a-zA-Z_]{4,20}@(163|126|qq)\.com", email)
    if match_email:
        print("%s符合郵箱格式,他是一個%s郵箱。" % (match_email.group(), match_email.group(1)))
    else:
        print("%s不符合郵箱格式。" % email)

(三)提取區號和電話號碼

import re
phone_num = "0351-5600123"
# 1、要想提取,那麼先用正則匹配,然後分組
# 2、以後遇到提取數據一般用正則分組
# 3、區號是以0開始的,並且可以出現三位或者四位
# 4、凡事以後不確定位數的都用?
# 5、電話號碼開頭不能爲0,一般爲7位或者8位用{m,n}
match_p_num= re.match("(0\d{2}\d?)-([1-9]\d{6,7}$)", phone_num)
print(match_p_num)
print("提取的區號是:%s" % match_p_num.group(1))

(四)分組的高級用法1

# 匹配出<html>hh</html>
import re
ret = "<html>hh</html>"
# 1、尖括號裏面可能出現的是大寫字母和小寫字母
# 2、而且不同尖括號裏的內容大致相同
# 3、尖括號裏的東西至少出現1次。用+
# 4、中間的內容位任意字符,可以出現0次以上
# 5、如果我們再重複斜前面的顯得有些麻煩,可以選擇把重複的內容分組匹配
# 6、\1代表第一次從左往右括號裏分組的重複內容
# 7、凡事用正則就把r加上。防止轉義了其中帶\的
match_ret = re.match(r"<([a-zA-Z]+)>\w*</\1>", ret)
print(match_ret.group())

(五)分組的高級用法2

# 匹配出<html><h1>www.itcast.cn</h1></html>
import re
# 1、匹配網址
# 2、如果尖括號出現多個,在用\1\2容易混淆
# 3、那麼我們需要再撇配的內容前加上(?P<name1>)(?P=name1)
# 4、摘取網址信息
# 5、python解釋器會提示錯誤信息,不要理會
ret = "<html><h1>www.itcast.cn</h1></html>"
match_ret = re.match(r"<([a-zA-Z]+)><([a-zA-Z0-9]+)>([w]{3}\.\w+\.cn)</\2></\1>", ret)
print(match_ret.group())
print(match_ret.group(3))
match_ret1 = re.match(r"<(?P<a1>[a-zA-Z]+)><(?P<a2>[a-zA-Z0-9]+)>([w]{3}\.\w+\.cn)"
                      r"</(?P=a2)></(?P=a1)>", ret)
print(match_ret1.group())

三、re模塊的高級用法

(一)search的用法 ( 匹配出文章閱讀的次數)

import re
ret = "文章的閱讀次數位:9999"
# 1、如果想匹配文章的次數,用match就不可以了
# 2、因爲match是從字符串開頭開始匹配。
# 3、而我先現在需要搜尋任意地方符合正則的字符串
# 4、提煉出次數,全是數字就ok
search_ret = re.search("\d+", ret)
print(search_ret.group())

(二)findall的用法 (統計出python、c、c++相應文章閱讀的次數)

import re
ret =  "python = 9999, c = 7890, c++ = 12345"
# 1、search搜索得到第一個符合標準的情況就不搜索了。
# 2、而要想取出全部的數字部分,那麼的用findall
# 3、注意findall不需要group
# 4、findall返回的是一個列表
findall_ret = re.findall(r"\d+", ret)
print(findall_ret)

(三)sub的用法

import re
content = """
<div>
        <p>崗位職責:</p>
<p>完成推薦算法、數據統計、接口、後臺等服務器端相關工作</p>
<p><br></p>
<p>必備要求:</p>
<p>良好的自我驅動力和職業素養,工作積極主動、結果導向</p>
<p>&nbsp;<br></p>
<p>技術要求:</p>
<p>1、一年以上 Python 開發經驗,掌握面向對象分析和設計,瞭解設計模式</p>
<p>2、掌握HTTP協議,熟悉MVC、MVVM等概念以及相關WEB開發框架</p>
<p>3、掌握關係數據庫開發設計,掌握 SQL,熟練使用 MySQL/PostgreSQL 中的一種<br></p>
<p>4、掌握NoSQL、MQ,熟練使用對應技術解決方案</p>
<p>5、熟悉 Javascript/CSS/HTML5,JQuery、React、Vue.js</p>
<p>&nbsp;<br></p>
<p>加分項:</p>
<p>大數據,數理統計,機器學習,sklearn,高性能,大併發。</p>

        </div>
"""
# 1、第一個參數是正則
# 2、第二個參數是符合正則的替換的字符串
# 3、第三個參數是文本內容
# 4、只要把所有的尖括號替換成""就ok了
# 5、如果我們不用?那麼相當於開啓貪婪模式,那麼從第一個尖括號開始,知道遇到最後一個尖括號才結束,裏面的內容都被替換
# 6、所以我們必須用?關閉貪婪模式。
# 7、用strip處理所有的空格。
sub_content = re.sub(r"<.+?>", "", content)
print(sub_content.strip())

(四)split的用法 (切割字符串“info:xiaoZhang 33 shandong”)

import re
ret = "info:xiaoZhang 33 shandong"
# 1、如果字符串中出現了多種富豪,那麼不能用普通的字符串切割,會很麻煩,應該用正則切割
# 2、切割後返回一個列表
# 3、第一個參數是正則需要處理的富豪
# 4、注意如果出現空格,則必須打出來。否則效果不一樣
      split_ret = re.compile(":| ")
split_data = split_ret.split( ret)
print(split_data)

(五)貪婪模式和非貪婪模式

import re
s = "This is a number 234-235-22-423"
# 1、貪婪模式一般針對於match和sub使用
# 2、如果在在"*","?","+","{m,n}"後面加上?,使貪婪變成非貪婪。
match_s = re.match("(.*)(\d+-\d+-\d+-\d+)", s)
# 打印效果如下-因爲處於貪婪模式,只給你留一個符合匹配的。
print(match_s.group(1))
print(match_s.group(2))
# This is a number 23
# 4-235-22-423
# 3、關閉貪婪模式
match_s1 = re.match("(.*?)(\d+-\d+-\d+-\d+)", s)
# 這樣的話只要後年有滿足的條件,就讓後面滿足
print(match_s1.group(1))
print(match_s1.group(2))
# This is a number
# 234-235-22-423
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章