正則表達式
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()