1. 程式人生 > >python中正則表示式的使用

python中正則表示式的使用

正則表示式

python中需要使用正則表示式對字串進行匹配的時候,需要匯入re模組

 #coding=utf-8

    # 匯入re模組
    import re

    # 使用match方法進行匹配操作
    result = re.match(正則表示式,要匹配的字串)

    # 如果上一步匹配到資料的話,可以使用group方法來提取資料
    result.group()

匹配單個字元

. 匹配任意1個字元(除了\n)

import re

ret =re.match(r"haha.haha","hahaahaha")
print(ret.group())

輸出結果
hahaahaha

[ ] 匹配 [ ] 中列舉的字元

import re

ret = re.match("[0-9]Hello Python","7Hello Python")
print(ret.group())

輸出結果
7Hello Python

\d 匹配數字,即0-9 \D 匹配非數字,即不是數字

import re

ret = re.match(r"\d","1Hello Python")
print(ret.group())

ret = re.match(r"\D","Hello Python")
print(ret.group())

輸出結果
1
H

\s 匹配空白,即 空格,tab鍵 \S 匹配非空白

import re

ret = re.match(r"\s"," 1Hello Python")
print(ret.group())

ret = re.match(r"\S","Hello Python")
print(ret.group())

輸出結果
 
H

\w 匹配單詞字元,即a-z、A-Z、0-9、_ \W 匹配非單詞字元

import re

ret = re.match(r"\w","1Hello Python")
print(ret.group())

ret = re.match(r"\W","@Hello Python")
print(ret.group())

輸出結果
1
@

匹配多個字元

“ * ” 匹配一個字元出現0次或者無限次,即可有可無

import re

ret = re.match("[A-Z][a-z]*","M")
print(ret.group())

ret = re.match("[A-Z][a-z]*","MnnM")
print(ret.group())

ret = re.match("[A-Z][a-z]*","Aabcdef")
print(ret.group())

輸出結果
M
Mnn
Aabcdef

“ + ” 匹配一個字元出現一次或者無限次,即至少一次

import re

names = ["name1", "_name", "2_name", "__name__"]

for name in names:
    ret = re.match("[a-zA-Z_]+[\w]*",name)
    if ret:
        print("變數名 %s 符合要求" % ret.group())
    else:
        print("變數名 %s 非法" % name)


輸出結果
變數名 name 符合要求
變數名 _name 符合要求
變數名 2_name 非法
變數名 __name__ 符合要求

" ? " 匹配一個字元出現一次或者0次

import re

ret = re.match("[1-9]?[0-9]","7")
print(ret.group())

ret = re.match("[1-9]?\d","33")
print(ret.group())

ret = re.match("[1-9]?\d","09")
print(ret.group())

輸出結果
7
33
0

{m} 匹配前一個字元出現m次 {m,n} 匹配前一個字元出現m 到 n 次

import re

ret = re.match("[a-zA-Z0-9_]{6}","12a3g45678")
print(ret.group())

ret = re.match("[a-zA-Z0-9_]{8,20}","1ad12f23s34455ff66")
print(ret.group())


輸出結果
12a3g4
1ad12f23s34455ff66

" ^ " 匹配字串開頭 " $ " 匹配字串結尾

email_list = ["[email protected]", "[email protected]", "[email protected]"]

for email in email_list:
    ret = re.match("[\w]{4,20}@163\.com$", email)
    if ret:
        print("%s 是符合規定的郵件地址,匹配後的結果是:%s" % (email, ret.group()))
    else:
        print("%s 不符合要求" % email)

輸出結果
[email protected] 是符合規定的郵件地址,匹配後的結果是:[email protected]
[email protected] 不符合要求
[email protected] 不符合要求

" | " 匹配左右任意一個表示式

import re
ret = re.match("[1-9]?\d$|100","78")
print(ret.group())

ret = re.match("[1-9]?\d$|100","100")
print(ret.group())

輸出結果
78
100

(ab) 將括號中字元作為一個分組

import re
ret = re.match("\w{4,20}@(163|126|qq)\.com", "[email protected]")
print(ret.group()) 

輸出結果
[email protected]

\num 引用分組num匹配到的字串

import re
test_label = "<html>hh</htmlbalabala>"
ret = re.match(r"<([a-zA-Z]*)>\w*</\1>", test_label)
if ret:
    print(ret.group())
else:
    print("%s 這是一對不正確的標籤" % test_label)

輸出結果
<html>hh</htmlbalabala> 這是一對不正確的標籤

re模組的高階用法

match 匹配string 開頭,成功返回Match object, 失敗返回None,只匹配一個。 search 在string中進行搜尋,成功返回Match object, 失敗返回None, 只匹配一個。

import re

ret = re.search(r"\d+", "閱讀次數為 9999")
ret.group()

輸出結果
'9999'

findall 在string中查詢所有 匹配成功的組, 即用括號括起來的部分。返回list物件,每個list item是由每個匹配的所有組組成的list。

import re

ret = re.findall(r"\d+", "python = 9999, c = 7890, c++ = 12345")
print(ret)

輸出結果
['9999', '7890', '12345']

sub 將匹配到的資料進行替換

import re

ret = re.sub(r"\d+", '998', "python = 997")
print(ret)

輸出結果
python = 998

split 根據匹配進行切割字串,並返回一個列表

import re

ret = re.split(r":| ","info:xiaoZhang 33 shandong")
print(ret)

輸出結果
['info', 'xiaoZhang', '33', 'shandong']

python貪婪和非貪婪

Python裡數量詞預設是貪婪的(在少數語言裡也可能是預設非貪婪),總是嘗試匹配儘可能多的字元;

非貪婪則相反,總是嘗試匹配儘可能少的字元。

在"*","?","+","{m,n}"後面加上?,使貪婪變成非貪婪。

>>> re.match(r"aa(\d+)","aa2343ddd").group(1)
'2343'
>>> re.match(r"aa(\d+?)","aa2343ddd").group(1)
'2'
>>> re.match(r"aa(\d+)ddd","aa2343ddd").group(1) 
'2343'
>>> re.match(r"aa(\d+?)ddd","aa2343ddd").group(1)
'2343'
>>>

r的作用

Python中字串前面加上 r 表示原生字串,

與大多數程式語言相同,正則表示式裡使用"“作為轉義字元,這就可能造成反斜槓困擾。假如你需要匹配文字中的字元”",那麼使用程式語言表示的正則表示式裡將需要4個反斜槓"\":前兩個和後兩個分別用於在程式語言裡轉義成反斜槓,轉換成兩個反斜槓後再在正則表示式裡轉義成一個反斜槓。

Python裡的原生字串很好地解決了這個問題,有了原生字串,你再也不用擔心是不是漏寫了反斜槓,寫出來的表示式也更直觀。

>>> ret = re.match(r"c:\\a",mm).group()
>>> print(ret)
c:\a