python的正則表達式(常用詳解)


  今天抽時間給大家整理一下正則表達式,有的同學可能還是不太懂這個東西,這次你看我的帖子,你就明白了,我寫的博客真的通俗易懂,真的一點都不難,希望您耐心看完,保管有用。

正則表達式,主要是做什么用的?這個概念得先理解,明白這個,你就能看懂正則一半了,就是用來匹配數據的,好的,接下來給大家上一些代碼和截圖:

1.單字符

import re

# 需求一:匹配如下數據中的手機號(11位的數字):
# s = "asdfsdg13789898768sdfksn13889898768000000svccv135898987680000000"
# res2 = re.findall("\d{11}", s)
# print(res2)

# --------------------單字符(元字符)---------------
# 1、. :匹配任意一個字符(除\n外)
# res = re.findall(".", 'abcd1234?_!&\n')
# print(res)  #打印結果為 ['a', 'b', 'c', 'd', '1', '2', '3', '4', '?', '_', '!', '&']


# 2、[] :列舉可以匹配的字符
# res = re.findall("[1-3]", 'ab243gzyw53cd1234?_!&\n')   # 從后面的字符串中,匹配數字1,2,3
# print(res)   #打印結果為 ['2', '3', '3', '1', '2', '3']
#
# res1 = re.findall("[a-c]", 'ab243gzyw53cd1234?_!&\n')   # 從后面的字符串中,匹配字母a到c
# print(res1)   #打印結果為 ['a', 'b', 'c']
#
# res1 = re.findall("[a-c0-9A-Z]", 'ab243gzGDRyw53cd1234?_!&\n')   # 從后面的字符串中,匹配所有的數字和字母
# print(res1)   #打印結果為 ['a', 'b', '2', '4', '3', 'G', 'D', 'R', '5', '3', 'c', '1', '2', '3', '4']


# 3、\d:匹配任意一個數字
# res = re.findall("\d", 'ab243gzyw53cd1234?_!&\n')
# print(res)      #打印結果為 ['2', '4', '3', '5', '3', '1', '2', '3', '4']

# 4、\D:匹配任意一個非數字
# res = re.findall("\D",' ab243gzyw53cd1234?_!&\n')   # 除數字之外的都能匹配
# print(res)   # 打印結果為 [' ', 'a', 'b', 'g', 'z', 'y', 'w', 'c', 'd', '?', '_', '!', '&', '\n']


# 5、\s:匹配任意一個空白字符(空格鍵、tab鍵、\n符)
# res = re.findall("\s", 'ab243gzyw5 3cd1  23    4?_!&\n')
# print(res)  # 打印結果為 [' ', ' ', ' ', ' ', ' ', ' ', ' ', '\n']

# 6、\S:匹配任意一個非空白字符
# res = re.findall("\S", 'ab2  43gzyw5')
# print(res)  # 打印結果為 ['a', 'b', '2', '4', '3', 'g', 'z', 'y', 'w', '5']

# 7、\w:匹配任意一個單字符(數字、字母、下划線)
# res = re.findall("\w", 'ab243gzyw5 3cd1  23    4?_!&\n')
# print(res)  # 打印結果為 ['a', 'b', '2', '4', '3', 'g', 'z', 'y', 'w', '5', '3', 'c', 'd', '1', '2', '3', '4', '_']

# # 8、\W:匹配任意一個非單詞字符(數字字母下划線)
# res = re.findall("\W", 'ab243gzyw53cd1234?_!&\n')
# print(res)   # 打印結果為 ['?', '!', '&', '\n']

看代碼,可能您有點煩,看不下去,好,我給您上圖:

 

2.字符數量

一般表示范圍的:如下圖所示

先給大家附上代碼,后面才有截圖解析

import re

# --------------------字符數量的表示---------------
# 1、{n}:表示前一個字符連續出現n次
# res = re.findall("\d{3}", "123aaa1111bb2323fs55555")
# print(res)  # 打印結果為 ['123', '111', '232', '555']

# 2、{n,m}:表示前一個字符連續出現n-m次
# res = re.findall("\d{3,5}", "123aaa1111bb2323fs55555")
# print(res)  # 打印結果為 ['123', '1111', '2323', '55555']

# 3、{n,}:表示前一個字符至少連續出現n次
# res = re.findall("\d{3,}", "123aa22a1111bb2323fs55555ss555565745bgg455625765757")
# print(res)   # 打印結果為 ['123', '1111', '2323', '55555', '555565745', '455625765757']

# 貪婪模式:python中正則匹配數量的時候,默認是貪婪模式
# 非貪婪模式:在表示數量范圍后面加個?,就可以關閉貪婪模式
# {n,m},{3,},+ ,*
# res = re.findall("\d{3,}?", "123aa22a1111bb2323fs55555ss555565745bgg455625765757")
# print(res)  # 打印結果為 ['123', '111', '232', '555', '555', '565', '745', '455', '625', '765', '757']

# 4、+:表示前一個字符至少出現1次以上
# res = re.findall("[a-z]+", "123aa22a1111bb2323fs55555ss555565745bgg455625765757")
# print(res)   # 打印結果為 ['aa', 'a', 'bb', 'fs', 'ss', 'bgg']
#
# # 5、*:表示前一個字符至少出現0次以上
# res = re.findall("[a-z]*", "123aa22a1111bb")
# print(res)  # 打印結果為 ['', '', '', 'aa', '', '', 'a', '', '', '', '', 'bb', '']

#
member_id = 120
pwd = "123456"

data = '{"member_id":"#member_id#","pwd":"#pwd#"}'
res = re.findall("#.+?#", data)
print(res)

data2 = '{"member_id":"#member_id#","pwd":"#pwd#","user":"#aaa#"}'
res2 = re.findall("#.+?#", data2)
print(res2)

截圖解析,一張一張來,傻逼也能看得懂,更何況是聰明機智的正在閱讀的你呢

 另外,這里再給將一個很重要的知識點:貪婪模式與非貪婪模式

 因為,涉及到這種模式的,還有 + * 等等,現在拿這兩種舉例,看下圖

 有的同學會問,這有什么實際應用呢?舉個例子如何,好,繼續往下看,

3.字符邊界和匹配分組

import re

# --------------------字符邊界的表示---------------
# 1、^:表示字符串開頭
# res = re.findall("^python", "python-00-java-00-php-python")
# print(res)  # 打印結果為 ['python']

# 2、$:表示字符串結尾
# res = re.findall("python$", "python-00-java-00-php-python")
# print(res)   # 打印結果為 ['python']

# # 3、\b:表示單詞邊界
# res = re.findall(r"\bpython\b", "python? java-00-java-00-php,python")
# print(res)  # 打印結果為 ['python', 'python']

# 4、\B:表示非單詞邊界
res = re.findall(r"\Bpython\B", "qqpythonqq? java-00-java-00-php,python")
print(res)  # 打印結果為  ['python']
# --------------------匹配分組的表示---------------
# 1、|:表示匹配多個規則
# 匹配3個數字或者三個字母   | 此時可理解為“或者”的意思
# res = re.findall("[a-z]{3}|\d{3}", "123aaa11ddd333fff4f4fws")
# print(res)   # 打印為 ['123', 'aaa', 'ddd', '333', 'fff', 'fws']


# # 2、():表示分組
data = '{"member_id":"#member_id#","pwd":"#pwd#","user":"#user#","loan_id":"#loan#"}'
# 重點掌握!!!
res = re.findall("#.*?#", data)
print(res)   # 打印為 ['#member_id#', '#pwd#', '#user#', '#loan#']

res = re.findall("#(.*?)#", data)
print(res)   # 打印為 ['member_id', 'pwd', 'user', 'loan']

4.正則參數替換

re模塊:使用正則表達式的官方庫
re.findall():查找匹配的所有數據,以列表的形式返回
re.search():匹配第一個符合規則的數據,返回一個匹配對象,匹配不到則返回None,此方法常用
re.match():匹配第一個符合規則的數據(必須在字符串的開頭),返回一個匹配對象,匹配不到則返回None
re.sub():替換

import re

# 1、re.search():匹配第一個符合規則的數據,返回一個匹配對象,匹配不到則返回None
data = '{"member_id":"#member_id#","pwd":"#pwd#","user":"#user#","loan_id":"#loan#"}'
res = re.search("#(.+?)#", data)
print(res)
print(res.group())
print(res.group(1))
# 從匹配對象中提取,匹配的內容
# group()獲取匹配到的數據
# group(x)獲取匹配到的數據中第x個分組中的內容
# print(res.group())
# print(res.group(1))

# 了解即可
# 2、re.match():匹配第一個符合規則的數據(必須在字符串的開頭),返回一個匹配對象
# 匹配不到則返回None
data = '{"member_id":"#member_id#","pwd":"#pwd#","user":"#user#","loan_id":"#loan#"}'
res = re.match(r"{", data)
print(res)


class EnvDate:
    member_id = 123
    user = "musen"
    pwd = "lemonban"
    loan = 31


# 3,sub
# data = '{"member_id":"#member_id#","pwd":"#pwd#","user":"#user#","loan_id":"#loan#"}'
# data = re.sub("#.+?#",str(EnvDate.member_id),data)
# print(data)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM