day18 - regular正則表達(dá)式

day17回顧

1.文件操作

打開文件,文件讀寫,關(guān)閉文件
with open(文件路徑,打開方式,encoding='utf-8') as 文件對象:
文件對象.read() - 讀
文件對象.write(內(nèi)容) - 寫

2.json數(shù)據(jù)

json數(shù)據(jù): 一個json有且只有一個數(shù)據(jù);這個數(shù)據(jù)類型是json支持的數(shù)據(jù)類型
number,string,boolean,array(list),dictionary(dict),null(None)

json數(shù)據(jù)轉(zhuǎn)python數(shù)據(jù):
json.loads(字符串,編碼類型) - 數(shù)據(jù)操作
json.load(字符串) - 文件操作
python數(shù)據(jù)轉(zhuǎn)json數(shù)據(jù):
json.dumps(python數(shù)據(jù)) - 數(shù)據(jù)操作
json.dump(python數(shù)據(jù),文件對象) - 文件操作

regular

1.什么是正則表達(dá)式

正則表達(dá)式是字符串匹配工具,它是為了在某些需求下可以更方便,更快速的處理字符串

2.什么是正則表達(dá)式處理字符串

python通過提供re模塊來支持我賣你正則表達(dá)式

re.fullmatch(正則表達(dá)式,字符串) - 讓正則表達(dá)式和字符串進(jìn)行完全匹配,返回匹配街故宮,如果匹配不成功返回None

3.怎么寫正則表達(dá)式

python中正則表達(dá)式是放在字符串中,并且這個字符串一般會在最前面加r/R
r'正則'

4.正則語法

    1. 普通字符 - 代表字符本身
re_str = r'abc'
result = re.fullmatch(re_str, 'abc')
print(result)
    1. . - 匹配一個任意字符
一個 . 代表一個字符,匹配的是任意字符
# 匹配一個字符串,長度是4,第一個字符是任意字符,后面三位是'abc'
re_str = r'.abc'
result = re.fullmatch(re_str, '1abc')
print(result)
    1. \w - 匹配一個ASCII表中字母,數(shù)字或者下劃線,還可以匹配所有的非ASCII表字符
re_str = r'.\w'
result = re.fullmatch(re_str, 'ss')
print(result)
    1. \s - 匹配一個空白字符
空白字符包括:空格,回車,制表符

# 匹配一個字符串有4個字符,第一個字符是空白,后面三個任意字符
re_str = r'\s...'
result = re.fullmatch(re_str, '\t456')
print(result)
    1. \d - 匹配一個數(shù)字字符
# 匹配一個字符串長度是5,前面三個字符是成績:后面是兩個數(shù)字
re_str = r'成績:\d\d'
result = re.fullmatch(re_str, '成績:44')
print(result)
    1. \b - 檢測單詞邊界(檢測\b是否是單詞邊界)
單詞邊界:所有能夠標(biāo)示一個單詞結(jié)束的符號都是單詞邊界例如:空格,回車,標(biāo)點(diǎn)符號等,字符串開頭,字符串結(jié)束
"""
# 匹配一個字符串是否是'howare,'并且要求w的后面(a的前面)是一個單詞邊界
re_str = r'how\b,are'
result = re.fullmatch(re_str,  'how,are')
print(result)
    1. ^ - 檢測是否是字符開頭
# 匹配兩個數(shù)字字符的字符串,并且建設(shè)這個字符串時候是字符串開頭

re_str = r'^how\b,are'
result = re.fullmatch(re_str,  'how,are')
print(result)
    1. $ - 檢測是否是字符串的結(jié)尾
    1. \大寫字母 - 對\小寫字母功能的否定

a.\W - 匹配非數(shù)字,字母,下劃線
b.\S - 匹配非空白字符
c.\D - 匹配非數(shù)字字符
d.\B - 檢測是否是非單詞邊界

re_str = r'\W\S\D\Bb'
result = re.fullmatch(re_str,  '~ovb')
print(result)
    1. [字符集] - 匹配[]中任意的一個字符
a.取出字符集中的一個
[普通字符集]  -  匹配[]中任意的一個字符
例如:[abc],[ab\d]
b.用'-'表示范圍
[字符1-字符2]  -  匹配編碼值再字符1編碼到字符2編碼之間的任意一個字符(ord(字符1)<ord(字符2))
例如:[1-8]   -   數(shù)字字符'0'到'8'中的一個
[一-龥]    -    所有中文字符中的一個
[a-zA-Z]    -    所有字母
c.[]內(nèi)容中的最前面加 ^ (Shift+6),表示否定(^ 只有放到[]里面才有意義,在[]其他位置表示普通字符'^')
[^abc]    -    匹配一個除了abc以外的任意字符
"""
# 匹配一個字符串長度是4后面3位是'123'第一位是'a','s','+'或者任意數(shù)字中的任意一個
re_str = r'[as\d]123'
result = re.fullmatch(re_str,  'a123')
print(result)
    1. 轉(zhuǎn)義符號 - 將正則中有特殊意義或者特殊功能的符號,表示符號本身(讓特殊意義消失)
      有歧義產(chǎn)生是使用''

a.在中括號外面
在特殊意義的符號前加''讓其特殊意義消失
b.在中括號里面
單獨(dú)的有特殊意義的符號,除了 '^' 在最前面,'-'在兩個字符之間,讓其他都不需要轉(zhuǎn)義,特殊意義自動消失

re_str = r'[1-9]\d+\.\d\d'
print(re.fullmatch(re_str, '1910.45'))

regular

1.匹配次數(shù)

        • 匹配0次或者多次

r'abc' - 匹配一個字符串'bc'前有0個或者多個a
r'\d
' - 匹配一個字符串由0個或者多個任意數(shù)字字符組成

# 練習(xí):寫一個正則表達(dá)式能夠匹配所有的小數(shù)
re_str = r'[1-9]\d*\.\d*\d'
result = re.fullmatch(re_str, '1.0')
print(result)
        • 匹配一次或者多次(至少一次)
          """
          r'\d+' - 數(shù)字出現(xiàn)一次或者多次
          r'[abc]+' - 匹配一個字符串有一個或者多個字符,每一個字符是abc中的一個
          """
    1. {}

{N} - 匹配N次, {3}匹配3次
{M,N} - 匹配M到N次
{M,} - 匹配至少M(fèi)次
{,N} - 匹配最多N次

re_str = r's\d{3}'
result = re.fullmatch(re_str, 's123')
print(result)

======貪婪和非貪婪======

2. 貪婪和非貪婪

a.以上是貪婪匹配:匹配次數(shù)不確定的時候,盡可能多
b.非貪婪:

    1. ? - 匹配一次或者0次
    1. 在匹配次數(shù)不確定的符號后面加?

在匹配次數(shù)不確定的符號后面加?
*?
+?
{M,N}?
{M,}?
{,N}?

3.=====分之(選擇)=====

分之符號 | - 相當(dāng)于邏輯運(yùn)算里面的or

正則1|正則2        -      先用正則1去匹配如果匹配成功就成功,匹配不成功在使用正則2去匹配
                          (字符串能和正則1,正則2中任意一個匹配成功就成功)


r'\d{6,12}|[A-Za-z]{6,12}'

4.=====分組:()=====

a.將小括號里面的內(nèi)容作為一個整體操作
b.\數(shù)字   --    重復(fù)第幾個分組匹配結(jié)果(必須要有分組)

"""
# 用戶名是7-13位,最后兩位必須是aa或者bb或者cc
re_str = r'[a-zA-Z\d]{5,11}(aa|bb|cc)'

re模塊

1.完全匹配 - 讓字符串的長度和字符串的每個字符的值和正則表達(dá)式完全匹配

"""
re.fullmatch(正則表達(dá)式, 字符串) - 匹配成功返回匹配對象,返回失敗返回None

當(dāng)需要隊(duì)整個字符串進(jìn)行條件判斷的時候使用:例如,檢查賬號是否合法,密碼是否符合要求等

result = re.fullmatch(r'(\d{3})=([a-z]{3})', '234=asd')
print(result)
    1. span - 匹配到的內(nèi)容在原字符串的位置
print(result.span())                # 整個正則表達(dá)式匹配結(jié)果的范圍
print(result.span(1))               # 正則表達(dá)式中第一個分組匹配結(jié)果的范圍
print(result.start(2), result.end(2))
  • 2)獲取匹配到的值
print(result.group())               # 整個正則表達(dá)式匹配結(jié)果
print(result.group(1))              # 正則表達(dá)式中第一個分組匹配結(jié)果

3)獲取原字符串

print(result.string)

2.匹配字符串開頭

re.match(正則表達(dá)式, 字符串) - 判斷字符串的開頭是否和正則表達(dá)式相匹配.匹配成功返回匹配對象,匹配失敗返回None

只檢測字符串開頭開頭是否滿足要求

result = re.match('\d{3}', '234456')
print(result)

3.search

re.search(正則表達(dá)式, 字符串) - 在字符串中查找哦是否有和正則表達(dá)式匹配的子串,
如果沒有返回None,如果有就返回第一個匹配結(jié)果

method
result = re.search(r'(\d{3})=([a-z]{3})', 'how 234=abced842=abc===')
print(result, result.span(1), result.group(1))


## 4.findall

re.findall(正則表達(dá)式,字符串)  -  獲取字符串中所有滿足正則表達(dá)式的子串,以列表的形式返回

注意: 正則表達(dá)式中有分組的時候
沒有分組 - 整個正則表達(dá)式匹配的結(jié)果作為列表元素(列表元素是字符串)
有一個分組 - 這個分組匹配到的結(jié)果作為列表元素(列表元素是字符串)
兩個以上分組 - 這個分組匹配到的結(jié)果作為列表元素(列表元素是元祖,幾個分組,元祖有幾個元素)
```python
result = re.findall(r'(\d+)([a-z])', 'are sda46ada456sd465ds564')
print(result)

5.finditer

re.finditer(正則表達(dá)式,字符串) - 獲取字符串中所有能夠和正則表達(dá)式匹配的子串的匹配結(jié)果.
返回值是一個迭代器,迭代器中的元素是匹配結(jié)果

result = re.finditer(r'abc(\d|[A-Z]{2})', 'abc4-abcHD===')
print(list(result))
for item in result:
    print(item.group())
    print(item.group(1))
# 練習(xí):計(jì)算一個字符值所有數(shù)字的和
# re 89he ks90.2 ans78oo1.23h!w9end9009ooo
re_str = r're 89he ks90.2 ans78oo1.23h!w9end9009ooo'
result = re.findall(r'(\d+\.?\d*)', re_str)
print(result)
n = 0
for item in result:
    n += float(item)
print(n)

** 短路操作 | 寫在前面的會先匹配,匹配成功不會管后面的**

6.split

re.split(正則表達(dá)式,字符串) - 將字符串按照滿足正則表達(dá)式的子串進(jìn)行切割

result = re.split(r'[=/+-]', 'aaa+hhh-jjj/kkk')
print(result)

7.sub

re.sub(正則表達(dá)式,新字符串,字符串,替換次數(shù)) - 將字符串中滿足正則表達(dá)式的子串替換成新字符串

替換次數(shù)不賦值,表示全部替換

result = re.sub(r'\d+', '=', 'das45ad12das46s21')
print(result)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蝉仇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子殖蚕,更是在濱河造成了極大的恐慌轿衔,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件睦疫,死亡現(xiàn)場離奇詭異害驹,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蛤育,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門宛官,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瓦糕,你說我怎么就攤上這事底洗。” “怎么了咕娄?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵枷恕,是天一觀的道長。 經(jīng)常有香客問我谭胚,道長徐块,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任灾而,我火速辦了婚禮胡控,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘旁趟。我一直安慰自己昼激,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布锡搜。 她就那樣靜靜地躺著橙困,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耕餐。 梳的紋絲不亂的頭發(fā)上凡傅,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機(jī)與錄音肠缔,去河邊找鬼夏跷。 笑死,一個胖子當(dāng)著我的面吹牛明未,可吹牛的內(nèi)容都是我干的槽华。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼趟妥,長吁一口氣:“原來是場噩夢啊……” “哼猫态!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起披摄,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤亲雪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后行疏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匆光,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年酿联,在試婚紗的時候發(fā)現(xiàn)自己被綠了终息。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡贞让,死狀恐怖周崭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情喳张,我是刑警寧澤续镇,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站销部,受9級特大地震影響摸航,放射性物質(zhì)發(fā)生泄漏制跟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一酱虎、第九天 我趴在偏房一處隱蔽的房頂上張望雨膨。 院中可真熱鬧,春花似錦读串、人聲如沸聊记。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽排监。三九已至支救,卻和暖如春帕翻,著一層夾襖步出監(jiān)牢的瞬間叶堆,已是汗流浹背塔沃。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工叉跛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留预侯,地道東北人朗伶。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓屯断,卻偏偏與公主長得像脱拼,于是被迫代替她去往敵國和親瞒瘸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

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