day17正則表達式

正則表達式

import re
"""
正則表達式就是做字符串匹配的一種工具座享,很多語言都支持正則語法。正則語法是通用的
python中通過re模塊提供的方法來使用正則
re.fullmatch(正則表達式,字符串) - 檢查字符串是否完全匹配正則表達式的要求
如果不匹配結果是None,如果匹配結果是一個匹配對象
正則表達式 - 滿足正則表達式的字符串 - r'正則表達式'

1.普通字符
普通字符在正則表達式中代表字符本身戈鲁,例如 a, b, 1, 2....
"""
print('+++++++++++++++++普通字符++++++++++++++++++')
# 1.普通字符
re_data = r'hello'  # 匹配hello字符串
resault = re.fullmatch(re_data, 'hello')
print(resault)
# 2.'.' - 匹配任意字符(換行符\n除外)

re_data1 = r'a.c'  # 匹配3位字符串稳捆,第一位是a汽纠,第二位是任意字符秤涩,第三位是c
resault = re.fullmatch(re_data1, 'a+c')
print(resault)
# 3. \w - 匹配字母數(shù)字下劃線 (還可以匹配中文日文等字符陶舞,不能匹配ASCILL碼表中字母數(shù)字下劃線除了不嚴謹一般不使用)
re_data2 = r'\w.'  # 匹配2位字符串抹剩,第一位要求是字母數(shù)字下劃線撑帖,后面是任意字符
resault = re.fullmatch(re_data2, 'のc')
print(resault)
# 4.\s - 匹配空白字符,一個\s只能匹配一個空白字符
re_data3 = r'...\s\s...'  # 匹配一個8位的字符串,要求前三位和后三位是任意字符澳眷,中間兩位必須的空白字符
resault = re.fullmatch(re_data3, '        ')
print(resault)
# 5.\d - 匹配一個數(shù)字字符
re_data4 = r'\d\dabc'  # 匹配一個5位的字符串胡嘿,要求前兩位必須是數(shù)字,后三位是abc
resault = re.fullmatch(re_data4, '09abc')
print(resault)
# 6.\W - (匹配非數(shù)字字母下劃線)
# 7.\S - (匹配非空白字符)
re_data5 = r'\Sabc'  # 匹配一個4位的字符串钳踊,要求第一位是除開非空白字符外的任意字符衷敌,后三位是abc
resault = re.fullmatch(re_data5, ' abc')
print(resault)
# 8. \D - 匹配非數(shù)字字符
re_data7 = r'\Dabc'  # 匹配一個4位的字符串勿侯,要求第一位是除開非數(shù)字字符外的任意字符,后三位是abc
resault = re.fullmatch(re_data7, ' abc')
print(resault)
# 9.[] - a.匹配字符集中的任何一個字符缴罗,一個[]只能匹配一個字符
# b.[字符1 - 字符2] - 匹配字符1到字符2中的任意一個字符(要求字符1的編碼必須小于字符2)
re_data8 = r'[xyz]abc'  # a.匹配一個4位的字符串助琐,要求第一位是xyz中的任意字符,后三位是abc
resault = re.fullmatch(re_data8, 'xabc')
print(resault)
# [\da-zA-Z_] 匹配字母數(shù)字下劃線
# [\u4e00-\u9fa5] 匹配所有中文
re_data9 = r'[2-8]abc'  # b.匹配一個4位的字符串面氓,要求第一位是2-8中的任意字符兵钮,后三位是abc
resault = re.fullmatch(re_data9, '7abc')
print(resault)
# 10. [^字符集] - 匹配不在字符集中的任意一個字符
re_data10 = r'[^\u4e00-\u9fa5]'  # 匹配一個非中文字符
resault = re.fullmatch(re_data10, 'の')
print(resault)

print('++++++++++++檢測字符的符號++++++++++++')
# 1. \b - 檢測單詞邊界,檢查\b所在的位置是否是單詞邊界
# 單詞邊界 - 字符串開頭或結尾舌界、空白掘譬、標點符號等
re_str = r'.abc\b'  # 匹配一個長度是4的字符串,第一個是任意字符呻拌,后三位是abc葱轩;檢測c的后面是否是單詞邊界
resault = re.fullmatch(re_str, '8abc')
print(resault)
re_str = r'how\b\sare'  # 要求匹配how are兩個字符串,how后面有個單詞邊界
resault = re.fullmatch(re_str, 'how are')
print(resault)

# 2.^檢測是否是字符串開頭
re_str = r'^abc'
resault = re.fullmatch(re_str, 'abc')
print(resault)
print(re.search(r'^\d\d', '92dkddka89dsd'))  # 檢測前兩位是否數(shù)字開頭

# 3.$ - 檢測是否字符串結尾
re_str = r'abc$'
resault = re.fullmatch(re_str, 'abc')
print(resault)
print(re.search(r'\d\d$', 'dkddka89dsd83'))  # 檢測后兩位是否數(shù)字結尾

print('++++++++++++++++++轉義符號+++++++++++++++++')
# 字有特殊功能意義的符號前加‘\’藐握,讓這個正則符號變成普通符號
# 出了^放在[]開頭靴拱,和-放在兩個字符之間以外,其他單獨的特殊符號趾娃,在[]沒有特殊功能都是表示字符本身
re_str = r'\d\d\.\d\d'  # 匹配一個5位字符串缭嫡,前后兩位是數(shù)字,中間是點
resault = re.fullmatch(re_str, '88.99')
print(resault)
# ^在[]中不是在開頭就沒有特殊意義,‘-’在[]只要不是在兩個字符之間都表示‘-’本身
re_str = r'\d\d[-^]\d\d'  # 匹配一個5位字符串抬闷,前后兩位是數(shù)字妇蛀,中間是或者-^
resault = re.fullmatch(re_str, '88^99')
print(resault)

print('++++++++++++++++匹配次數(shù)++++++++++++++++')
# 1. * - 匹配0次或者多次
"""
字符* - 字符出現(xiàn)0次或者多次
\d* - 數(shù)字出現(xiàn)0次或者多次
[a-z]*  - 小寫字母匹配0次或者多次
"""

re_str = r'a*'  # 匹配一個字符串,a可以出現(xiàn)0次或者多次
resault = re.fullmatch(re_str, 'aaaaaaaaaa')
print(resault)
# 2. +  - 匹配1次或者多次
re_str = r'a+'  # 匹配一個字符串笤成,a可以出現(xiàn)1次或者多次
resault = re.fullmatch(re_str, 'aaaaaaaaaa')
print(resault)
# 3.评架? - 匹配一個字符出現(xiàn)0次或者1次
# 練習寫一個正則表達式,能夠匹配一個整數(shù)
re_str = r'[-+]?\d+'
resault = re.fullmatch(re_str, '+555')
print(resault)
# 4.{}
"""
{n} - 匹配n次
{m,n} - 匹配最少m次炕泳,最多n次纵诞,m < n
{m,} - 至少m次
{,n} - 至少n次
"""
re_str = r'\d{4}'
resault = re.fullmatch(re_str, '5555')
print(resault)
# 練習培遵,要求密碼是否符號要求浙芙,密碼要求由數(shù)字字母組成并且第一個字符是大寫,長度6-12
# 符合要求提示可用籽腕,不符合提示不合格
# re_str = r'[A-Z][a-zA-Z\d]{5,11}'
# strs = input('請輸入密碼:')
# resault = re.fullmatch(re_str, strs)
# if resault:
#     print('恭喜嗡呼!密碼符合要求')
# else:
#     print('很遺憾!密碼不符合要求')


# 5.貪婪皇耗,非貪婪
"""
貪婪 - 匹配次數(shù)不確定的時候盡可能多的匹配(上面次數(shù)不確定的符號都是貪婪的)
非貪婪 - 匹配次數(shù)不確定的時候盡可能少的匹配(上面次數(shù)不確定的符號后面加會變成非貪婪)
*南窗? - 0次或者多次,盡可能少
+? - 1次或者多次万伤,盡可能少
窒悔?? - 0次或者1次敌买,盡可能少
{m,n}?
{m,}?
{,n}?
"""
re_str = r'a+'
resault = re.search(re_str, 'aaaa')
print(resault)
re_str = r'a+?'
resault = re.search(re_str, 'aaaa')
print(resault)
print('++++++++++++++++++分支和分組++++++++++++++++++++')
"""
匹配一個字符串简珠,開頭是abc或者xyz,后面是123   abc123 ,xyz123
1.正則1|正則2 - 先用正則1匹配虹钮,如果匹配失敗再用正則2匹配北救,如果正則1和正則2中
只要有一個匹配成功就成功,兩個失敗才失敗
注意:如果正則1匹配成功則不會使用正則2匹配
2.() - 分組芜抒,將部分正則作為一個整體
"""
re_str = r'(abc|xyz)\d{1,}'  # 匹配一個至少4位字符串,前三位必須是abc或者xyz后面是數(shù)字
resault = re.fullmatch(re_str, 'abc5555')
print(resault)
# 3. \m - 重復前面第m個分組匹配到的內(nèi)容
# 89ab89托启, 11abc11
re_str = r'(\d\d)ab\1'  # 匹配一個開頭和結尾是兩位相同次數(shù)宅倒,中間是ab的字符串
resault = re.fullmatch(re_str, '45ab45')
print(resault)
# 聯(lián)系,判斷中國移動屯耸、電信拐迁、聯(lián)通的電話號碼
re_str1 = r'([1][358]\d\d{8})'  # 移動
re_str2 = r'([1][3458][01256]\d{8})'  # 聯(lián)通
re_str3 = r'([1][358][0139]\d{8})'  # 電信

num = '18200482453'
resault1 = re.fullmatch(re_str1, num)
resault2 = re.fullmatch(re_str2, num)
resault3 = re.fullmatch(re_str3, num)
if resault1:
    print(num, '你輸入的是移動號碼')
elif resault2:
    print(num, '你輸入的是聯(lián)通號碼')
elif resault3:
    print(num, '你輸入的是電信號碼')
else:
    print('你輸入的不是三大運營商的號碼')
    
from re import *
"""
1.compile(正則表達式) - 創(chuàng)建正則表達式對象
re_str = r'\d{3}'
re_obj = compile(re_str)

2.fullmatch - 完全匹配--成功時返回匹配對象,不成功返回None
fullmatch(正則表達式疗绣,字符串) - 讓正則和字符安全匹配线召,對整個字符串檢查時使用
比如:判斷賬號密碼,手機號多矮,郵箱等
"""
print('++++++2+++++')
resault = fullmatch(r'\d{3}[a-z]{2}[A-Z]{3}', '232anAHS')
print(resault)
# 3.match(正則表達式缓淹, 字符串) - 讓正則和字符串開頭匹配,匹配失敗返回None,成功返回對象
print('++++++3+++++')
resault = match(r'\d{3}', '232anAHS')
print(resault)
# 4.search - 字符串查找
# search(正則表達式塔逃,字符串)在字符串中找到第一個和正則表達式匹配的字串匹配失敗返回None,成功返回對象
print('++++++4+++++')
resault = search(r'(\d{3})', 'dk789djsdn7654')
print(resault)
print(resault.span())
print(resault.start())
print(resault.end())
print(resault.group(1))
print(resault.string)
"""
通過匹配對象可以獲取已下內(nèi)容:
a.匹配結果
print(resault.group()) - 獲取整個正則表達式匹配到的結果
print(resault.group(1)) - 獲取第一個分組匹配到的結果


b.匹配范圍 - 被匹配到的內(nèi)容在遠在圓字符串中的范圍(開始讯壶,結束下標)
print(resault.span())  -- 開始和結尾
print(resault.start())  -- 開始下標
print(resault.end()) -- 結束下標

c.獲取原字符串
print(resault.string)
"""
# 5.split - 字符串切割
# 將字符串按照滿足正則表達式的字串進行切割
# 切割次數(shù) - 不傳參就全切
print('++++++++++++5+++++++++++')
print(split(r'\d+|[A-Z]+', 'jshbds786dsjAHD551'))

# 6.sub - 字符串替換
# sub(正則,替換字符串湾盗,原字符串) - 將原字符串中滿足正則表達式的字串替換成新串
# 替換次數(shù) - 不傳參就全部替換
print(sub(r'\d+', '+', 'dde4de55555de8de9'))
# 7.findall - 查找所有
# findall(正則表達式伏蚊, 字符串) - 在字符串中查找所有滿足正則表達式的字串,以列表的形式返回
print(findall(r'\d+', 'dsjdk8995ddd4dss6dsd7ad2'))
# 有一個分組格粪,只取分組匹配到的內(nèi)容
print(findall(r'(\d+)d', 'dsjdk8995ddd4dss6dsd7ad2'))
# 有多個分組躏吊,只取分組匹配到的內(nèi)容
print(findall(r'(\d+)([a-z]{2})', 'dsjdk8995ddd4dss6dsd7ad2'))
# 注意:使用findall的時候,如果有分組想要取得整個正則匹配的結果是取不到的

# 8.finditer - 查找所有
# finditer(正則表達式帐萎, 字符串) - 在字符串中查找所有滿足正則表達式的字串比伏,
# 返回一個迭代器,元素是每個字串對應的匹配對象
result = finditer(r'(\d[a-z]){3}\+', 'ahjs8a2a8j+胡士大夫9m2s0j+接收到sd8p+ss===')
print(result)
for x in result:
    print(x.group(), x.group(1))



def get_name():
    with open('data.txt', encoding='utf-8') as f:
        content = f.read()
        print(content)
        re_str = r'"name":"(.+?)",'
        result = findall(re_str, content)
        # result = re.findall(r'\d\d','ashjf89kjskdf90naskhfk899nn,nmf67jkhh56hkhjk78')
        print(result)
# get_name()

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吓肋,一起剝皮案震驚了整個濱河市凳怨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖肤舞,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件紫新,死亡現(xiàn)場離奇詭異,居然都是意外死亡李剖,警方通過查閱死者的電腦和手機芒率,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來篙顺,“玉大人偶芍,你說我怎么就攤上這事〉旅担” “怎么了匪蟀?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宰僧。 經(jīng)常有香客問我材彪,道長,這世上最難降的妖魔是什么琴儿? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任段化,我火速辦了婚禮,結果婚禮上造成,老公的妹妹穿的比我還像新娘显熏。我一直安慰自己,他們只是感情好晒屎,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布喘蟆。 她就那樣靜靜地躺著,像睡著了一般夷磕。 火紅的嫁衣襯著肌膚如雪履肃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天坐桩,我揣著相機與錄音尺棋,去河邊找鬼。 笑死绵跷,一個胖子當著我的面吹牛膘螟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播碾局,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼荆残,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了净当?” 一聲冷哼從身側響起内斯,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤蕴潦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后俘闯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體潭苞,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年真朗,在試婚紗的時候發(fā)現(xiàn)自己被綠了此疹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡遮婶,死狀恐怖蝗碎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情旗扑,我是刑警寧澤蹦骑,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站臀防,受9級特大地震影響脊串,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜清钥,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望放闺。 院中可真熱鬧祟昭,春花似錦、人聲如沸怖侦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匾寝。三九已至搬葬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間艳悔,已是汗流浹背急凰。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留猜年,地道東北人抡锈。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像乔外,于是被迫代替她去往敵國和親床三。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1.正則基本符號 1.什么是正則表達式正則表達式就是字符匹配工具杨幼;是由正則符號和普通字符組成撇簿,來匹配不同規(guī)律的字符...
    楊海py閱讀 793評論 0 0
  • 1.正則基本符號 1.1.什么是正則表達式正則表達式就是字符匹配的工具聂渊;是由正則符號和普通字符組成,來匹配不同規(guī)律...
    未醒的夢_19b0閱讀 447評論 0 0
  • 1.什么是正則表達式 正則表達式就是字符匹配的工具四瘫,是由正則符號和普通字符組成汉嗽,來匹配不同規(guī)律的字符串。 2.py...
    遇見那天的雨真大閱讀 430評論 0 0
  • 昨天原本想要進行的瑜伽活動被我的懶惰又推遲了莲组。晚上10點半哄睡的時候诊胞,腦子里“做”和“不做”一直在做斗爭。最后想锹杈,...
    大仙鶴閱讀 137評論 0 0
  • 我們要做成一些事情撵孤,必然會遇到各種各樣的困難,遇到困難就會產(chǎn)生一系列的挫敗感竭望,過多的挫敗感會嚴重損耗成事信心邪码。沒有...
    自我創(chuàng)造閱讀 166評論 0 0