python正則表達式

筆記:
一:簡介
正則表達式是一個特殊的字符序列,它能幫助你方便的檢查一個字符串是否與某種模式匹配。
主要介紹Python中經常使用的正則表達式處理函數
提升工做效率,完成內置函數沒法完成的任務!
搜索經常使用正則表達式!----->提升工做效率!
有意識的多食用正則表達式!
做用是快速檢索文本,實現一些替換文本的操做。
檢測一串數字是否是電話號碼,字符串是否是email,字符串的替換。

二:re.findall函數

在字符串中匹配正則表達式,返回形式爲列表!

number1 = re.findall(r'\d+', string1)
(1)'python' 普通字符,
(2)'\d'元字符---->百度百科元字符
(3)字符集 a[bf]c
(4)歸納字符集
# 數字[0-9] 非數字[^0-9] 字符'\D'
# \w == [0-9A-Za-z_] 匹配單詞字符 \W 匹配非單詞字符
# \D \d
# \s 空白字符 \S 非空白字符
(5)數量詞 [a-z]{3,6}?
(6)邊界匹配 '^\d{4,8}$
(7)匹配模式(flags
re.I 使匹配對大小寫不敏感
re.L 作本地化識別(locale-aware)匹配
re.M 多行匹配,影響 ^ 和 $
re.S 使 . 匹配包括換行在內的全部字符
re.U 根據Unicode字符集解析字符。這個標誌影響 \w, \W, \b, \B.
re.X 該標誌經過給予你更靈活的格式以便你將正則表達式寫得更易於理解。

二:re.sub函數(正則替換)
re.sub用於替換字符串中的匹配項
re.sub(pattern, repl, string, count=0)

pattern : 正則中的模式字符串。
repl : 替換的字符串,也可爲一個函數。
string : 要被查找替換的原始字符串。
count : 模式匹配後替換的最大次數,默認 0 表示替換全部的匹配。

三:re.match函數
re.match 嘗試從字符串的起始位置匹配一個模式,若是不是起始位置匹配成功的話,match()就返回none
其餘使用和findall函數徹底相同
re.match(pattern, string, flags=0)

pattern:匹配的正則表達式
string:要匹配的字符串
flags:標誌位

四:re.search函數
re.search 掃描整個字符串並返回第一個成功的匹配。
re.search(pattern, string, flags=0)

pattern:匹配的正則表達式
string:要匹配的字符串
flags:標誌位
代碼:
  1 import re
  2 a = 'C|Python|Java|C#|Python|Javascript|Python'
  3 print(a.index('Python') > -1)   # 判斷字符是否是在字符串中
  4 print('Python' in a)
  5 
  6 # -----------------------------------------------#
  7 # re.findall函數
  8 # -----------------------------------------------#
  9 # re.findall('正則表達式', a)--->使用關鍵爲正則表達式爲變量
 10 # ---------------------常量--------------------#
 11 r = re.findall('Python', a)
 12 if len(r) > 0:
 13     print("字符串中包含PHP")
 14 else:
 15     print("no")
 16 print(r)    # 輸出結果用列表的形式存放
 17 
 18 # ----------------------元字符-----------------#
 19 string1 = 'C3Python4Java5C#6Python7Javascript8Python'
 20 # for in
 21 # 正則表達式
 22 
 23 number1 = re.findall(r'\d+', string1)
 24 # D表示非數字,d表示數字 + 表示連續查找!
 25 print(number1)
 26 
 27 # ---------------------字符集-----------------#
 28 string2 = 'afc, acc, adc, aec, abc, ahc'
 29 r = re.findall('a[bf]c', string2)   # 找出中間爲b或者f的
 30 print(r)
 31 
 32 r = re.findall('a[^bf]c', string2)  # 找出中間不爲b或者f的
 33 print(r)
 34 
 35 r = re.findall('a[c-f]c', string2)  # 連續字符
 36 print(r)
 37 
 38 # ---------------------歸納字符集-----------------#
 39 # 數字[0-9] 非數字[^0-9] 字符'\D'
 40 # \w == [0-9A-Za-z_] 匹配單詞字符  \W 匹配非單詞字符
 41 # \D \d
 42 # \s 空白字符           \S 非空白字符
 43 
 44 string3 = 'afc, acc ahcdsfa sfa s f465 454 561_61'
 45 
 46 r = re.findall('[0-9A-Za-z_]', string3)  # 連續字符s
 47 print(r)
 48 
 49 # ---------------------數量詞-----------------#
 50 
 51 string4 = 'python 11111java678php'
 52 r = re.findall('[a-z]{3,6}', string4)   # 貪婪模式匹配
 53 print(r)
 54 
 55 # 貪婪和非貪婪    Python傾向貪婪
 56 
 57 r = re.findall('[a-z]{3,6}?', string4)   # 非貪婪模式匹配
 58 print(r)
 59 
 60 # 匹配 * 前面的一個字符出現零次或者無限屢次
 61 # 匹配 + 前面的一個字符出現1次或者無限屢次
 62 # 匹配 ? 前面的一個字符出現0次或者1次(字符串的截取)
 63 # 匹配 . 匹配除了換行符\n以外的全部字符
 64 
 65 string5 = 'pytho0python1pythonn2'
 66 r = re.findall('python?', string5)
 67 print('string5:', r)
 68 
 69 # ---------------------邊界匹配-----------------#
 70 # ^表示從開始匹配 $ 表示從末尾匹配
 71 
 72 qq = '107847'
 73 r = re.findall('^\d{4,8}$', qq)
 74 print(r)
 75 
 76 # ----------------------組-------------------#
 77 
 78 a = 'pythonpythonpythonpythonpythonpythonpython'
 79 r = re.findall('(python){2}', a)
 80 print(r)
 81 
 82 # ---------------------匹配模式------------------#
 83 
 84 a = 'pythonC#JavaPHP'
 85 r = re.findall('c#', a, re.I)
 86 print(r)
 87 
 88 
 89 # -------------------------------------------------#
 90 # re.sub函數
 91 # -------------------------------------------------#
 92 
 93 lanuage = 'PythonC#JavaPHP'
 94 r = re.sub('C#', 'Go', lanuage, count=0)
 95 # replace函數
 96 print(r)
 97 
 98 # 把函數當作參數傳到sub函數中,對於不一樣的對象作不一樣的處理!
 99 
100 
101 def convert(value):
102     print(value)
103     matched = value.group()         # 獲取匹配到的字符串
104     return '!!' + matched + '@@'    # 對字符串修改
105 
106 
107 r = re.sub('C#', convert, lanuage, count=0)
108 # 把匹配到的字符串做爲函數的實參傳入函數中,並在函數中對匹配的字符串操做,
109 # 返回替換後的字符串
110 print(r)
111 
112 
113 # -------------------------------------------------#
114 # 函數做爲參數的正則匹配例子
115 # -------------------------------------------------#
116 # 數字大於等於6的替換爲9,小於等於6的替換爲0
117 
118 def convert1(value):
119     matched = value.group()
120     matched = int(matched)  # 轉換爲數字
121     if matched > 6:
122         return '9'  # 只能返回字符串
123     elif matched < 6:
124         return '0'
125     print(matched)
126 
127 
128 s = 'A8C3721D86'
129 r = re.sub('\d', convert1, s)
130 print(r)
131 
132 # 軟件設計思想: 一個函數用另外一個函數做爲參數
133 # 接受一個值,返回一個值,不關心中間的處理過程
134 
135 # -------------------------------------------------#
136 # search函數和match函數
137 # -------------------------------------------------#
138 s = '18C3721D86'
139 r = re.match('\d', s)
140 r = r.span()    # 拿出位置和值
141 print(r)
142 
143 r = re.search('\d', s)
144 r = r.group()
145 print(r)        # 拿出值
146 
147 # -------------------------------------------------#
148 # group分組-----()
149 # -------------------------------------------------#
150 # (爬蟲的應用:根據標籤找到標籤中間的內容,不包括標籤自己)
151 s = 'life is short, i use python'
152 r = re.search('life(.*)python', s)
153 print(r.group(0))    # 獲取分組後的匹配結果
154 print(r.group(1))    # 獲取分組後的匹配結果
155 
156 r = re.findall('life(.*)python', s)
157 print(r)    # 獲取分組後的匹配結果
158 
159 
160 s = 'life is short, i use python, i love python'
161 r = re.search('life(.*)python(.*)python', s)
162 print(r.group(0))    # 獲取分組後的匹配結果
163 print(r.group(1))    # 獲取分組後的匹配結果
164 print(r.group(2))    # 獲取分組後的匹配結果
165 
166 print(r.group(0, 1, 2))    # 獲取分組後的匹配結果
167 
168 print(r.groups())           # 匹配結果
相關文章
相關標籤/搜索