程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python 正則表達式

編輯:Python

文章目錄

  • 一. 符號列表
  • 二. Python對正則表達式的支持
  • 三. 樣例
    • 3.1 例1
    • 3.2 例2
    • 3.3 例3(不良內容過濾)
    • 3.4 例4 判斷字符串是否含有某些字符
    • 3.5 從字符串中提取數字, 若是萬元,則轉為元
    • 3.6 貪婪匹配與非貪婪匹配的區別

一. 符號列表

符號解釋示例說明.匹配任意字符b.t可以匹配bat / but / b#t / b1t等\w匹配字母/數字/下劃線b\wt可以匹配bat / b1t / b_t等
但不能匹配b#t\s匹配空白字符(包括\r、\n、\t等)love\syou可以匹配love you\d匹配數字\d\d可以匹配01 / 23 / 99等\b匹配單詞的邊界\bThe\b^匹配字符串的開始^The可以匹配The開頭的字符串$匹配字符串的結束.exe$可以匹配.exe結尾的字符串\W匹配非字母/數字/下劃線b\Wt可以匹配b#t / [email protected]等
但不能匹配but / b1t / b_t等\S匹配非空白字符love\Syou可以匹配love#you等
但不能匹配love you\D匹配非數字\d\D可以匹配9a / 3# / 0F等\B匹配非單詞邊界\Bio\B[]匹配來自字符集的任意單一字符[aeiou]可以匹配任一元音字母字符[^]匹配不在字符集中的任意單一字符[^aeiou]可以匹配任一非元音字母字符*匹配0次或多次\w*+匹配1次或多次\w+?匹配0次或1次\w?{N}匹配N次\w{3}{M,}匹配至少M次\w{3,}{M,N}匹配至少M次至多N次\w{3,6}|分支foo|bar可以匹配foo或者bar(?#)注釋(exp)匹配exp並捕獲到自動命名的組中(? <name>exp)匹配exp並捕獲到名為name的組中(?:exp)匹配exp但是不捕獲匹配的文本(?=exp)匹配exp前面的位置\b\w+(?=ing)可以匹配I’m dancing中的danc(?<=exp)匹配exp後面的位置(?<=\bdanc)\w+\b可以匹配I love dancing and reading中的第一個ing(?!exp)匹配後面不是exp的位置(?<!exp)匹配前面不是exp的位置*?重復任意次,但盡可能少重復a.*b
a.*?b將正則表達式應用於aabab,前者會匹配整個字符串aabab,後者會匹配aab和ab兩個字符串,也就是貪婪匹配與非貪婪匹配的區別+?重復1次或多次,但盡可能少重復也就是貪婪匹配與非貪婪匹配的區別??重復0次或1次,但盡可能少重復也就是貪婪匹配與非貪婪匹配的區別{M,N}?重復M到N次,但盡可能少重復也就是貪婪匹配與非貪婪匹配的區別{M,}?重復M次以上,但盡可能少重復也就是貪婪匹配與非貪婪匹配的區別

說明: 如果需要匹配的字符是正則表達式中的特殊字符,那麼可以使用\進行轉義處理,例如想匹配小數點可以寫成\.就可以了,因為直接寫.會匹配任意字符;同理,想匹配圓括號必須寫成\(和\),否則圓括號被視為正則表達式中的分組。

二. Python對正則表達式的支持

Python提供了re模塊來支持正則表達式相關操作,下面是re模塊中的核心函數。

函數說明compile(pattern, flags=0)編譯正則表達式返回正則表達式對象match(pattern, string, flags=0)用正則表達式匹配字符串 成功返回匹配對象 否則返回Nonesearch(pattern, string, flags=0)搜索字符串中第一次出現正則表達式的模式 成功返回匹配對象 否則返回Nonesplit(pattern, string, maxsplit=0, flags=0)用正則表達式指定的模式分隔符拆分字符串 返回列表sub(pattern, repl, string, count=0, flags=0)用指定的字符串替換原字符串中與正則表達式匹配的模式 可以用count指定替換的次數fullmatch(pattern, string, flags=0)match函數的完全匹配(從字符串開頭到結尾)版本findall(pattern, string, flags=0)查找字符串所有與正則表達式匹配的模式 返回字符串的列表finditer(pattern, string, flags=0)查找字符串所有與正則表達式匹配的模式 返回一個迭代器purge()清除隱式編譯的正則表達式的緩存re.I / re.IGNORECASE忽略大小寫匹配標記re.M / re.MULTILINE多行匹配標記

說明: 上面提到的re模塊中的這些函數,實際開發中也可以用正則表達式對象的方法替代對這些函數的使用,如果一個正則表達式需要重復的使用,那麼先通過compile函數編譯正則表達式並創建出正則表達式對象無疑是更為明智的選擇。

三. 樣例

3.1 例1

""" 驗證輸入用戶名和QQ號是否有效並給出對應的提示信息 要求: 用戶名必須由字母、數字或下劃線構成且長度在6~20個字符之間 QQ號是5~12的數字且首位不能為0 """
import re
def main():
username = input('請輸入用戶名: ')
qq = input('請輸入QQ號: ')
m1 = re.match(r'^[0-9a-zA-Z_]{6,20}$', username)
print(m1.group()) # 打印出匹配出的值
if not m1:
print('請輸入有效的用戶名.')
m2 = re.match(r'^[1-9]\d{4,11}$', qq)
if not m2:
print('請輸入有效的QQ號.')
if m1 and m2:
print('你輸入的信息是有效的!')
if __name__ == '__main__':
main()

3.2 例2

import re
def main():
# 創建正則表達式對象 使用了前瞻和回顧來保證手機號前後不應該出現數字
pattern = re.compile(r'(?<=\D)(1[38]\d{9}|14[57]\d{8}|15[0-35-9]\d{8}|17[678]\d{8})(?=\D)')
sentence = ''' 重要的事情說8130123456789遍,我的手機號是13512346789這個靓號, 不是15600998765,也是110或119,王大錘的手機號才是15600998765。 '''
# 查找所有匹配並保存到一個列表中
mylist = re.findall(pattern, sentence)
print(mylist)
print('--------華麗的分隔線--------')
# 通過迭代器取出匹配對象並獲得匹配的內容
for temp in pattern.finditer(sentence):
print(temp.group(1))
print('--------華麗的分隔線--------')
# 通過search函數指定搜索位置找出所有匹配
m = pattern.search(sentence)
while m:
print(m.group())
m = pattern.search(sentence, m.end())
if __name__ == '__main__':
main()

3.3 例3(不良內容過濾)

""" 不良內容過濾 """
import re
def main():
sentence = '你丫是傻叉嗎? 我操你大爺的. Fuck you.'
purified = re.sub('[操肏艹]|fuck|shit|傻[比屄逼叉缺吊屌]|煞筆',
'*', sentence, flags=re.IGNORECASE)
print(purified)
if __name__ == '__main__':
main()

3.4 例4 判斷字符串是否含有某些字符

""" 字符串是否含有某些字符 """
files = ["str", 'str1', 'str2', 'str1.str2']
for file in files:
r = re.search(r'str1|str2', file)
if r:
print(f'{
file} OK')
else:
print(f'{
file} not OK')

3.5 從字符串中提取數字, 若是萬元,則轉為元

import re
def fun(value:str) ->str:
if value is None:
res = None
else:
value = re.sub('[,\s]','',str(value)) # 去除千分位的逗號和空白符號
# pattern = re.compile('-?\d+\.?\d*[萬元]{,2}') # 最重要的表達式,慢慢理解吧 -?表示適配負數
pattern = re.compile('[-\d\.萬元]*') # 粗略些的表達式
result = re.findall(pattern, value)
if result:
val = result[0]
if val.isdigit() or re.sub('[-.]', '', val).isdigit():
res = val
elif re.search("萬元|萬", val):
val = re.sub("萬元|元", '', val)
res = str(float(val) * 10000)
elif re.search("元", val):
res = re.sub("萬", '', val)
else:
res = '0'
else:
res = "0"
return res

pattern = re.compile(‘-?\d+.?\d+[萬元]{,2}’) 解析如下:
-? 支持查找負數
\d+ 數據的整數部分,至少1位數據
\.? 轉義後的小數點, 0或1個
\d* 數據的小數部分,
[萬元]{,2} 數據的單位, 最多匹配2個, 這裡僅支持萬或萬元和元轉換為元,其它單位再補充吧

3.6 貪婪匹配與非貪婪匹配的區別

匹配輸入串A: 1001000100
貪婪匹配:
使用 1.1 將會匹配到10010001
非貪婪匹配:
使用 1.
?1 將會匹配到1001

主要區別在於是否加?
當加了?緊隨任何其他限定符之後時,匹配模式是"非貪心的"。
“非貪心的"模式匹配搜索到的、盡可能短的字符串,
而默認的"貪心的"模式匹配搜索到的、盡可能長的字符串


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved