正則匹配方法及示例

南橋經不起秋發表於2020-09-25

正則匹配

match進行匹配

import re

# match方法進行匹配,從頭開始匹配。match這個函式如果成功匹配,返回的就是一個物件,如果匹配不到資料,返回的就是None
result = re.match('python','python is good')
print(result)

# group這個方法用來提取匹配到的資料
print(result.group())

注意點:
1、match從頭匹配

字元

.單個任意字元

result = re.match('.','bcd')
print(result.group())

[]匹配列舉字元的任何一位 [ ]

result = re.match('[pP]','Python')
print(result.group())

\d 匹配數字

# re1 = re.match('[0123456789]','123python')
# re1 = re.match('[0-9]','923python')
re1 = re.match('\d','923python')

在這裡插入圖片描述

\D 匹配的是非數字

re1 = re.match('\D','@923python')

\w 匹配的是a-z A-Z 0-9_

re1 = re.match('[a-zA-Z_0-9]','123_aASD923python')
re1 = re.match('\w','asd_123_aASD923python')

\W 匹配的非單詞字元

匹配指定的字元個數

* 代表的是可有可無,代表的是0次或者無數次(沒有不報錯)

str1 = 'Qwe'
re1 = re.match('[A-Z][a-z]*',str1)

+ 代表的是至少有一位 (必須有,沒有就報錯)

# 匹配變數名是否生效
str1 = '_name123_asd'
re1 =re.match('[a-zA-Z_]+[\w]*',str1)

?(寫在[]後面)後面匹配的字元出現一次或者0次

#匹配0-99之間的數字
re1 = re.match('[1-9]?[0-9]','988')

{}的匹配具體的位數

型別說明
{m}匹配一個字元出現m次
{m,}匹配的是一個字元至少出現m次
{m,n}匹配字元出現的次數從m次到n次
# 匹配的8-20位密碼,可以是數字,字母下劃線
re1 = re.match('[\w]{8,20}','asd123asd123')

print(re1.group())

表示字串的邊界

$表示以。。。。結尾

# 匹配的是郵箱
re1 = re.match(r'[\w]{4,20}@163\.com$','asd123@163.comasd123')

^ 表示以。。。開頭

re1 = re.match(r'^[\w]{4,20}@163\.com$','@asd123@163.com')

分組

|表示的是任何一個表示式都可以

re1 = re.match(r'[1-9]?\d$|100','100')

()分組

#匹配電話號碼,要求取出要求取出區號或者電話號碼。
re1=re.match(r'(\d{2,4})-(\d{7})$','0571-8922222')
print(re1.group())
print(re1.group(1))
print(re1.group(2))

\number關於引用分組匹配到的字串

# 匹配的是<div>this is div</div>
# 匹配DIV。匹配尖括號DIV。尖括號。這是DIV。尖括號。
str1 = '<a>this is div</a>'
re1 = re.match(r'<[a-zA-Z]+>.*</[a-zA-Z]+>',str1)
re1 = re.match(r'<([a-zA-Z]+)>.*</\1>',str1)
print(re1.group())

注意點:
1、第一個分組的結果,作為第二個人分組額依據
2、適用於成對出現的資料

(?P) 和(?P=name)

str2 = '<div><a>這是包著的超連結</a></div>'
re1 = re.match('<(?P<name1>\w+)><(?P<name2>\w+)>.*</(?P=name2)></(?P=name1)>',str2)
print(re1.group())

re的高階用法

match(匹配)開頭

從開頭進行匹配
def match(pattern, string, flags=0):
    """Try to apply the pattern at the start of the string, returning
    a match object, or None if no match was found."""
    return _compile(pattern, flags).match(string)

search(搜尋)全部,在一個字串中查詢

def search(pattern, string, flags=0):
    """Scan through string looking for a match to the pattern, returning
    a match object, or None if no match was found."""
    return _compile(pattern, flags).search(string)

注意點:
1、查詢整個字串

findall (查詢所有符合條件的,返回一個列表)

def findall(pattern, string, flags=0):
    """Return a list of all non-overlapping matches in the string.

    If one or more capturing groups are present in the pattern, return
    a list of groups; this will be a list of tuples if the pattern
    has more than one group.

    Empty matches are included in the result."""
    
 注意點:
 1、將字串中所有符合要求的字元返回
 2、返回的結果是一個列表型別
 3、如果沒有符合條件的,返回的是一個空列表

sub(將字串中匹配正規表示式的部分替換為其他值)

def sub(pattern, repl, string, count=0, flags=0):
    """Return the string obtained by replacing the leftmost
    non-overlapping occurrences of the pattern in string by the
    replacement repl.  repl can be either a string or a callable;
    if a string, backslash escapes in it are processed.  If it is
    a callable, it's passed the match object and must return
    a replacement string to be used."""
    return _compile(pattern, flags).sub(repl, string, count)
ret = re.sub('\d{2}','19','age is 18,phone is 123',1)
print(ret)

split (根據匹配分割字串,返回分割字串組成的列表)

ret = re.split(' |,','age is 18,phone is 123')
print(ret)

貪婪匹配與非貪婪匹配

print('######################################')
re1 = re.match('\d*?','123456789')
re1 = re.match('\d+?','123456789')
print(re1.group())

注意點:
1、預設的狀態是貪婪匹配,儘可能多的去匹配字元個數
2、在多個匹配符號後面,比如:*  +  {m,n}

import re
a='python'
b=re.match('p(.*?)n',a).group()
#只匹配開頭
print(b)

a='asdasd656165dsadas56166516'
#只匹配一次
b=re.search('\d+',a).group()  #匹配第一次數字串
print(b)

a='sdad316564dadas56665465asdas5661616'
##匹配所有。並返回一個列表
res =re.compile("\d+")#編譯正規表示式,適用於正規表示式較長以及多次使用
b=re.findall('\d+',a)#查詢全部數字串\D+是所有非數字
print(b)


a='sdad316564dadas56665465asdas5661616'
##匹配所有。並返回一個列表
res =re.compile("\d+")#編譯正規表示式,適用於正規表示式較長以及多次使用
b=re.sub(res,'+',a)#把匹配到的所有數字串都變成+號
print(b)


a='sdad316564dadas56665465asdas5661616'
##匹配所有。並返回一個列表
res =re.compile("\d+")#編譯正規表示式,適用於正規表示式較長以及多次使用
b=re.split(res,a)#以數字進行分割,返回一個列表
print(b)

相關文章