python基礎學習淺學正則表達式

#########################################第一部分:正則表達式概念

正則表達式所面向的問題
1、判斷一個字符串是否匹配給定的格式
判斷用戶註冊帳號是否滿足格式
2.從一個字符串中按指定格式提取信息
抓取頁面中的鏈接

#########################################第二部分:re模塊
在Python中需要通過正則表達式對字符串進行匹配的時候,可以使用一個模塊來操作,名字爲re

1、findall方法:
在字符串中找到正則表達式所匹配的所有子串,並返回一個列表,如果沒有找到匹配的,則返回空列表

2、match方法:(從開頭開始匹配)
re.match 嘗試從字符串的起始位置匹配一個模式,匹配成功
返回的是一個匹配對象(這個對象包含了我們匹配的信息),
如果不是起始位置匹配成功的話,match()返回的是空,
注意:match只能匹配到一個

來個例子看看:
import re

str_3 = ‘寒沙你是中國最帥的男人’
my_str = re.match(r’最帥的男人’,str_3) #匹配不成功的例子
print(my_str) # 輸出爲:None

my_str = re.match(r’寒沙’,str_3) #匹配成功的例子
print(my_str) # 匹配成功,但是這個方法成功的時候返回的是對象,需要使用其方法
print(my_str.group()) # 輸出爲:寒沙老師
print(my_str.span()) #輸出爲:(0, 2),匹配的字符在字符串內的位置,區間形式
print(my_str.start()) #輸出爲:0, 匹配的字符串在字符串中的起始位置
print(my_str.end()) #輸出爲:2, 匹配的字符串在字符串中的結束位置

拓展一個:
分組:
import re

str_4 = ‘aababbabbb’

my_str = re.match(r’(a)(ab)(abb)(abbb)’,str_4)
print(my_str.group()) # 輸出爲:aababbabbb
print(my_str.groups()) # 輸出爲:(‘a’, ‘ab’, ‘abb’, ‘abbb’)

print(my_str.group(0)) # 輸出爲:aababbabbb
print(my_str.group(1)) # 輸出爲:a
print(my_str.group(2)) # 輸出爲:ab
print(my_str.group(3)) # 輸出爲:abb

3、search方法:(從任意位置匹配)
re.search 掃描整個字符串,匹配成功 返回的是一個匹配對象(這個對象包含了我們匹配的信息)
注意:search也只能匹配到一個,找到符合規則的就返回,不會一直往後找

來個例子看看:
import re

str_3 = ‘寒沙你是中國最帥的男人’
my_str = re.search(r’最帥的男人’,str_3)
print(my_str.group()) # 輸出爲:最帥的男人
#也可以使用match的那些方法

4、sub方法 替換
str_3 = ‘吳某你好帥,吳某喜歡吃屎’
my_str = re.sub(r’吳某’,‘張某’,str_3,count = 2) # count 限制修改的次數
print(my_str) # 輸出爲:張某你好帥,張某喜歡吃屎

4、split方法 切割
str_3 = ‘寒沙你是中國最帥的男人寒沙你真棒’
my_str = re.split(r’寒沙’,str_3)
print(my_str) #輸出爲:[’’, ‘你是中國最帥的男人’, ‘你真棒’]

##########################################第三部分:元字符

問題一: 什麼是元字符 ?
本身具有特殊含義的字符

import re


第一個例子說明一些元字符:::
str = ‘寒沙老帥你真棒寒沙老帥你真胖’
######(1) . 代表任意一個字符(除了\n)
mystr = re.findall(r’.’,str) # 輸出爲:[‘寒’, ‘沙’, ‘老’, ‘帥’, ‘你’, ‘真’, ‘棒’,
print(mystr) # ‘寒’, ‘沙’, ‘老’, ‘帥’, ‘你’, ‘真’, ‘胖’]

mystr = re.findall(r’寒沙.’,str) # 輸出爲:[‘寒沙老’, ‘寒沙老’]
print(mystr)

#####(2) [] 匹配[]中列舉的字符
mystr = re.findall(r’[老帥你]’,str)
print(mystr) # 輸出爲:[‘老’, ‘帥’, ‘你’, ‘老’, ‘帥’, ‘你’]

#####(3) 以^開頭,以KaTeX parse error: Expected 'EOF', got '#' at position 4: 結尾 #̲####(4) {a,b}…’,str) # 這樣取不到,因爲字符串不是以‘寒沙.’開頭,且以‘胖’結尾
print(mystr) # 輸出爲:[]

mystr = re.findall(r’胖$’,str)
print(mystr) # 輸出爲:[‘胖’]

mystr = re.findall(r’^寒沙.{1,100}胖$’,str)
print(mystr) # 輸出爲:[‘寒沙老帥你真棒寒沙老帥你真胖’]

#####(5) \b 匹配一個單詞的邊界; \B 匹配非單詞邊界。
mystr = re.findall(r’\b寒沙’,str) # 因爲只有第一個寒沙左邊是邊界,所以只會匹配第一個寒沙
print(mystr) # 輸出爲:[‘寒沙’]

str = ‘寒沙?老帥你真棒,寒沙。老帥你真胖’
mystr = re.findall(r’\b寒沙\b’,str)
print(mystr) # 輸出爲:[‘寒沙’, ‘寒沙’]

str = ‘寒沙老帥你真棒寒沙,老帥你真胖’
mystr = re.findall(r’\B寒沙\b…’,str)
print(mystr) #輸出爲:[‘寒沙,老’]

第二個例子說明一些元字符:::
#+ 至少一個:匹配前一個字符出現1次或者無限次
#?至多一個:匹配前一個字符出現1次或者0次,即要麼有1次,要麼沒有
#* 0到任意一個:匹配前一個字符出現0次或者無限次,即可有可無

str = ‘aababbabbb’
my_str = re.findall(r’ab+’,str)
print(my_str) # 輸出爲:[‘ab’, ‘abb’, ‘abbb’]

my_str = re.findall(r’ab?’,str)
print(my_str) # 輸出爲:[‘a’, ‘ab’, ‘ab’, ‘ab’]

my_str = re.findall(r’ab*’,str)
print(my_str) # 輸出爲:[‘a’, ‘ab’, ‘abb’, ‘abbb’]

拓展:
貪婪模式和非貪婪模式:
正則默認都是用貪婪模式去匹配數據的,就是儘可能多的匹配符合要求的數據,在非貪婪模式下(使用非貪婪模式,要加?),始終找最短匹配

例如上面的例子變爲非貪婪模式:
str = ‘aababbabbb’
my_str = re.findall(r’ab+?’,str)
print(my_str) # 輸出爲:[‘ab’, ‘ab’, ‘ab’]

my_str = re.findall(r’ab??’,str)
print(my_str) # 輸出爲:[‘a’, ‘a’, ‘a’, ‘a’]

my_str = re.findall(r’ab*?’,str)
print(my_str) # 輸出爲:[‘a’, ‘a’, ‘a’, ‘a’]


第三個例子說明一些元字符:
import re

str_2 = ‘qdasfsdf32423542dasff’

#(1) 全部取到的方法:
my_str = re.findall(r’[a-z0-9]+’,str_2)
print(my_str) # 輸出爲:[‘qdasfsdf32423542dasff’]

#(2) ^ 非,相反的意思 脫字符
my_str = re.findall(r’[0-9]+’,str_2)
print(my_str) # 輸出爲:[‘32423542’]

my_str = re.findall(r’[^0-9]+’,str_2)
print(my_str) # 輸出爲:[‘qdasfsdf’, ‘dasff’]

#(3) \d 匹配數字,即0-9
my_str = re.findall(r’\d+’,str_2)
print(my_str) # 輸出爲:[‘32423542’]

#(4) \D 匹配非數字,即不是數字
my_str = re.findall(r’\D+’,str_2)
print(my_str) # 輸出爲:[‘qdasfsdf’, ‘dasff’]


第四個例子說明一些元字符:
import re

str_2 = ‘asdfsd\n432 4sfs吳某’

#(5) \s 匹配空白,即空格,Tab鍵
my_str = re.findall(r’\s+’,str_2)
print(my_str) # 輸出爲:[’\n’, ’ ']

#(5) \S 匹配非空白
my_str = re.findall(r’\S+’,str_2)
print(my_str) # 輸出爲:[‘asdfsd’, ‘432’, ‘4sfs吳某’]

#(6) \w 任意一個字母(注意會取中文) 0-9,a-z,A-Z
my_str = re.findall(r’\w+’,str_2)
print(my_str) # 輸出爲:[‘asdfsd’, ‘432’, ‘4sfs吳某’]

#(7) \W 任意非字符
my_str = re.findall(r’\W+’,str_2)
print(my_str) # 輸出爲:[’\n’, ’ ']

#(8) | 或者
my_str = re.findall(r’a|d’,str_2)
print(my_str) # 輸出爲:[‘a’, ‘d’, ‘d’]


第五個例子說明一個元字符:
import re

str_2 = ‘吳某同學好帥’

#(9) () 只取括號裏的 將括號中字符作爲一個分組
my_str = re.findall(r’吳某同學(好帥)’,str_2)
print(my_str) #輸出爲:[‘好帥’]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章