正則表達式 #re #python

  • 正則表達式在各種語言中基本都通用
  • 正則表達式就是找到我們需要數據的一種規則

python使用正則表達式

在這裏插入圖片描述

正則表達式

1.匹配單個字符

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

在這裏插入圖片描述

2.匹配多個字符

  • 匹配多個字符,匹配的是次數,需要和其它字符或匹配結合使用
字符 功能
* 匹配前一個字符出現0次或者無限次,即可有可無
+ 匹配前一個字符出現1次或者無限次,即至少有1次
? 匹配前一個字符出現1次或者0次,即要麼有1次,要麼沒有
{m} 匹配前一個字符至少出現m次
{m,n} 匹配前一個字符出現從m到n次

在這裏插入圖片描述

  • re.match(r".*", 待匹配字符, re.S)這樣就可以匹配到換行符,re.S叫做旗標

3.判斷開頭結尾

  • 開頭結尾必須全匹配上
  • match默認會判斷開頭,但是不會判斷結尾
字符 功能
^ 匹配開頭
$ 匹配結尾

1>小練習:判斷變量名是否合法

name = input("請輸入變量名")
re.match(r"^[a-zA-Z_][a-zA-Z0-9_]*$", name)

2>小練習:判斷是否是身份證號

UID = input("請輸入變量名")
re.match(r"\d{17}[01X]$", UID)

3>小練習:判斷是否是郵箱

email = input("請輸入變量名")
re.match(r"^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+$", email)

4.分組

  • 利用括號進行分組
  • |的意思是或
email = input("請輸入變量名")
re.match(r"^[a-zA-Z0-9]+@(163|126|qq)\.com$", email)
字符 功能
| 匹配左右任意一個表達式
(ab) 將括號中字符作爲一個分組
\num 引用分組num匹配到的字符串
(?P) 分組起別名
(?P=name) 引用別名爲name分組匹配到的字符串
  • 當中取數據:(取出的是小括號裏,正則匹配到的值)
    在這裏插入圖片描述
  • 取出匹配的組值 \num
    在這裏插入圖片描述
  • 給分組取名 (?P<name>),取用別名(?P=name)

在這裏插入圖片描述

4.re的高級用法

  • 前面的用法是通用的,後面的用法是python專用的(其它語言也可能有)

search

  • match是從頭開始匹配,search是任意位置開始匹配,只取第一個匹配到的位置

findall

  • findall可以匹配到所有匹配的位置,返回一個列表

sub

  • sub可以替換子串
re.sub(r"待替換", "替換爲", "待匹配的字符串")
  • sub替換爲可以用函數
def add1(temp):
    """加一函數"""
    num_str = temp.group()
    num = int(num_str) + 1
    return str(num)

# 第二個參數放入函數名,即可把re.search(r"\d+", "998")的值傳入temp,即 把匹配的對象傳入函數
ret = re.sub(r"\d+", add1, "998")
print(ret)

split

  • split可以根據匹配進行切割,並返回一個列表
re.split(r";|:","一個;兩個:三個")

5.小項目:清洗數據

  1. 從網上Down下一段網站的部分源碼(我是去Boss直聘Down下了阿里的職位描述)
    在這裏插入圖片描述
  2. 分析一波:清洗掉標籤,可以用sub
    在這裏插入圖片描述
  3. 效果:
    在這裏插入圖片描述
發佈了30 篇原創文章 · 獲贊 24 · 訪問量 3456
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章