'''
1. 元字符
符號 含義
. 匹配除換行以外的任意字符
^ 匹配字符串的開始位置,在[]中出現為非的意思
$ 匹配字符串的結束位置
* 匹配0次、1次或多次前面的原子
? 匹配0次或1次前面的原子
+ 匹配1次或多次前面的原子
{n} 前面的原子恰好出現n次
{n,} 前面的原子至少出現n次
{n,m} 前面的原子至少出現n次,至多出現m次
| 模式選擇符
() 模式單元符,作分組:在findall 中使用,返回的參數是()中匹配的值,不會管外面其他參數
(?:reg):取消優先級,在findall中使用,會返回滿足全部正則的字符,而不是返回字符的一部分(reg是變量)
(?P<name>);給分組指定name. (name是變量)
[] 字符集,里面出現的字符都只表示某一個字符,不會有轉義問題
eg:
[a-z0-9A-Z] 數字,大小寫字母中的一個
通用字符
符號 含義
\w 匹配任意一個字母、數字或下划線
\W 匹配除字符、數字和下划線以外的任意一個字符
\d 匹配任意一個十進制數
\D 匹配除十進制數以外的任意一個其它字符
\s 匹配任意一個空白字符
\S 匹配除空白字符以外的任意一個其它字符
\b:表示字母數字與非字母數字的邊界, 非字母數字與字母數字的邊界。
\B:表示字母數字與(非非)字母數字的邊界,非字母數字與非字母數字的邊界。
eg:匹配以a開頭的字符串
str = 'adfd fdfad1a 2 a31 fda a'
pattern = r'\ba\w*\b'
print(re.findall(pattern,str))
2. 貪婪模式與懶惰模式
pattern1 = "p.*n" # 貪婪模式
pattern2 = "p.*?n" # 懶惰模式
?指定前一個數量元字符匹配次數為1(*為0-1)
3. 模式修正符
符號 含義
I 匹配時忽略字母大小寫
M 多行匹配
L 做本地化識別匹配
U 根據Unicode字符及解析字符
S 使元字符"."匹配包括換行在內的所有字符
X 使存在分行符的正則表達式,也能正確匹配(目的:讓表達式邏輯更清晰)
re.findall('pattern1','str',re.I)
4. RE中常用的方法(函數)
方法/屬性 作用
re.match(pattern, string, flags=0) 從字符串的起始位置匹配,成功返回MatchObject 實例,失敗就返回none
re.search(pattern, string, flags=0) 查找第一個成功的匹配,返回SearchObject 實例,失敗就返回none
re.findall(pattern, string, flags=0) 找到RE匹配的所有字符串,並把他們作為一個列表返回
re.finditer(pattern, string, flags=0) 找到RE匹配的所有字符串,並把他們作為一個迭代器返回
re.sub(pattern, repl, string, count=0, flags=0) 替換匹配到的字符串
re.subn(pattern, repl, string, count=0, flags=0) 替換匹配到的字符串,並返回一個元組:(result,替換了幾次)
re.split(pattern, string, maxsplit=0, flags=0) 根據正則,對源字符串進行切割
re.compile(pattern[, flags])
作用:把正則表達式語法轉化成正則表達式對象,通過對象來調用函數
好處:
1.此函數是先編譯為正則對象再來調用,因此在多次匹配時,可以減少編譯次數
2.函數調用更簡捷,不用再傳pattern
函數參數說明:
pattern:匹配的正則表達式。
string:要匹配的字符串。
flags:標記為,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。
repl:替換的字符串,也可作為一個函數。
count:模式匹配后替換的最大次數,默認0表示替換所有匹配。
maxsplit:最大切割次數
分組函數返回實例:
方法/屬性 作用
group(num=0) 匹配的整個表達式的字符串,group() 可以一次輸入多個組號,在這種情況下它將返回一個包含那些組所對應值的元組。
groups() 返回包含所有小組字符串的元組,從1到所含的小組
groupdict() 返回以有別名的組的別名為鍵、以該組截獲的子串為值的字典
start() 返回匹配開始的位置
end() 返回匹配結束的位置
span() 返回一個元組包含匹配(開始,結束)的位置
'''
import re
def re_object_test():
'''
類似的函數有:match()、search()…,返回值為一個對象
方法: 功能:
group() 返回 RE 匹配的字符串值
start() 返回 匹配開始的位置
end() 返回 匹配結束的位置
span() 以元組形式返回 匹配( 開始,結束 ) 的位置
'''
pattern = r"python." # 設定以 "python" 為切割標識符
string = "ABCpython2DEFpython3GHIpython4567"
result = re.search(pattern, string)
print(result.group()) # 輸出匹配的內容
print(result.span()) # 輸出匹配的位置信息
print(result.start()) # 輸出匹配內容的 起始位置
print(result.end())
def sub_test():
'''
查找並替換
語法格式:
re.sub(pattern, repl, string, count=0, flags=0)
pattern:傳入需要匹配的正則表達式。
repl:替換后的字符串
string:傳入需要匹配的源字符串。
count:指定替換的個數
flags:標志位(可選參數),可傳入“模式修正符”等信息。
'''
pattern = r"python."
string = "ABCpython2DEFpython3GHIpython4567"
result1 = re.sub(pattern, "java", string) # 默認替換所有
result2 = re.sub(pattern, "java", string, 2) # 替換 2 次
print(result1)
print(result2)
def split_test():
'''
語法格式:
re.split(pattern, string, maxsplit=0, flags=0)
pattern:傳入需要匹配的正則表達式。
string:傳入需要匹配的源字符串。
maxsplit:指定最大的切割次數
flags:標志位(可選參數),可傳入“模式修正符”等信息。
'''
pattern = r"python" # 設定以 "python" 為切割標識符
string = "ABCpython2DEFpython3GHIpython4567"
result1 = re.split(pattern, string) # 全局切割
result2 = re.split(pattern, string, 2) # 只切割 2 次
print(result1)
print(result2)
def search_test():
'''
re.search(pattern, string[, flags])
返回第一個查找到的
作用:在字符串中查找匹配正則表達式模式的位置,返回 MatchObject
的實例,如果沒有找到匹配的位置,則返回 None。
'''
pattern = r"(?P<name>python)(?P<t>.)"
string = "ABCpython2DEFpython3GHIpython4567"
res = re.search(pattern,string)
print(res.group('t'))
print(res.group(1))
print(res.groupdict())
print(res.span())
pass
if __name__ == "__main__":
# sub_test()
# split_test()
# re_object_test()
search_test()