日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python---正则表达式

發(fā)布時間:2023/12/1 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python---正则表达式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

正則表達式的基本語法我這里就不再敘述了,網(wǎng)上一大堆,我就不一一列舉了,用到的正則表達式我會在分析中列舉。

1. 寫一個正則表達式判斷一個字符串是否是ipv4地址。規(guī)則:一個ip地址由4個數(shù)字組成,每個數(shù)字之間用.連接。每個數(shù)字的大小是0-255 例如:255.189.10.37 正確,256.189.89.9 錯誤。

思路:首先可知ip是由四部分組成,但是前三部分可以同樣對待,最后一個由于少一個. 故分開對待處理。而且每個數(shù)字必須在0-255之間,其中處理0-255,可以按位數(shù)處理,三位即2、5、5,第一位[0-2],第二位[0-5],第三位[0-5]

import re re_str =r'(([0-1]?\d?\d?|2[0-4]\d|25[0-5])\.){3}([0-1]?\d?\d?|2[0-4]\d|25[0-5])' result = re.fullmatch(re_str,'255.183.10.37') print(result)

運行效果圖如下:

import re re_str =r'(([0-1]?\d?\d?|2[0-4]\d|25[0-5])\.){3}([0-1]?\d?\d?|2[0-4]\d|25[0-5])' result = re.fullmatch(re_str,'256.189.89.9') print(result)

運行效果圖如下:

分析: r'(([0-1]?\d?\d?|2[0-4]\d|25[0-5])\.){3}([0-1]?\d?\d?|2[0-4]\d|25[0-5])'用到的正則表達式: r‘xxxx’ --- 單引號里面的xxx原樣對待 [0-1] --- []表示范圍,匹配位于[]中的任意字符 --- [0-1]即匹配01 [0-4] --- []表示范圍,匹配位于[]中的任意字符 --- [0-4]即匹配01234 [0-5] --- []表示范圍,匹配位于[]中的任意字符 --- [0-5]即匹配012345 \d --- 匹配任意數(shù)字,相當于[0-9] ? --- 匹配位于?之前的0個或1個字符 | --- 匹配位于|之前或之后的內(nèi)容 {m,n} --- {}前的字符或子模式重復至少m次,最多n次 () --- 將位于()中的內(nèi)容作為一個整體對待,表示一個子模式 fullmatch(pattern,string[,flags]) --- 從字符串的開始處匹配模式,返回match對象或None現(xiàn)在開始分解正則表達式:以()分隔符分解三部分子模式如下([0-1]?\d?\d?|2[0-4]\d|25[0-5])\.) --- 再以|為分隔符細分:[0-1]?\d?\d? --- [0-1][0-9][0-9]000-1992[0-4]\d --- 2[0-4][0-9]200-24925[0-5])\. --- 25[0-5].250-255. 這里有個.要注意最終表示000-255. 最后有個.{3} --- 表示{}前的字符或子模式重復3次,即上面的子模式重復執(zhí)行3([0-1]?\d?\d?|2[0-4]\d|25[0-5]) --- 與第一部分一樣,只不過少個.最后的結(jié)果為000-255.000-255.000-255.000-255 即正則表達式搜索屬于該范圍的內(nèi)容。
2.使用正則表達式查找文本中最長的數(shù)字字符串。

首先,分兩種方法通過兩個不同的函數(shù)來實現(xiàn)。longest1(s):查找所有連續(xù)數(shù)字 、longest2(s):使用非數(shù)字作為分隔符。其中查找所有連續(xù)數(shù)字是\d來處理分割的、而使用非數(shù)字作為分隔符則通過[^\d]來分割實現(xiàn)的

import re def longest1(s):#查找所有連續(xù)數(shù)字t = re.findall('\d+',s)#findall(pattern,string[,flag])返回包含字符串中所有的與給定模式匹配的項的列表#print(t) #['123456789', '123', '456789']print(max(t,key = len))#max函數(shù)有兩個參數(shù):一個可迭代對象(a)和一個可選的“key”函數(shù)。 Key功能將用于評估a中最大的項目的值。if t:return max(t,key = len)#max() 方法返回給定參數(shù)的最大值,參數(shù)可以為序列。return -1def longest2(s):#使用非數(shù)字作為分隔符t = re.split("[^\d+]",s)#split(pattern,string[,maxsplit=0])根據(jù)模式匹配項分隔字符串#print(t) #['123456789', '', '123', '', '456789']if t:return max(t,key = len)return -1m = "123456789ss123dd456789"print(longest1(m)) print(longest2(m))

效果圖如下:

分析: 代碼關(guān)鍵有這三個: findall(pattern,string[,flag]) --- 返回包含字符串中所有的與給定模式匹配的項的列表 findall('\d+',s) --- 匹配s字符串中的[0-9]字符split(pattern,string[,maxsplit=0]) --- 根據(jù)模式匹配項分隔字符串 split("[^\d+]",s) --- 匹配s字符串中以非[0-9]字符為分割符分割s字符串max(t,key = value) --- max函數(shù)有兩個參數(shù):一個可迭代對象(t)和一個可選的“key”函數(shù),key功能將用于評估t中最大的項目的值。key可以接受一個函數(shù),這個函數(shù)對key之前出現(xiàn)的參數(shù)進行運算。 max(t,key = len) --- 按t這個列表中的每個元素的長度為參數(shù),返回列表中長度最大的那個元素用到的正則表達式: \d --- 匹配任意數(shù)字,相當于[0-9] + --- 匹配位于+之前的字符或子模塊的1次或多次的出現(xiàn) [^\d] --- [^\d] 反向字符集,即除[0-9]之外的其他字符
3.將一句英語文本中的單詞進行倒置,標點不倒置,假設(shè)單詞之間使用一個或多個空格進行分割。比如I like beijing. 經(jīng)過函數(shù)后變?yōu)?#xff1a;beijing. like I。

首先,通過\s分割,分割之后存放到一個列表中,然后通過反轉(zhuǎn)輸出即可。這里為了格式的需求通過.join(t)以空格為分割來進行連接

import re def reverse(s):t = re.split("\s+",s.strip())#split(pattern,string[,maxsplit=0])根據(jù)模式匹配項分隔字符串t.reverse()#對列表的元素進行反向排序return ' '.join(t)#將序列中的元素以指定的字符連接生成一個新的字符串,這里是通過空格來連接t這個列表中的所有元素 print(reverse('I like beijing.')) print(reverse('Simple is better than complex.'))

效果圖如下:

分析: 代碼關(guān)鍵有這三個: split(pattern,string[,maxsplit=0])根據(jù)模式匹配項分隔字符串 strip()方法 用于移除字符串頭尾指定的字符(默認為空格或換行符)或字符序列 split("\s+",s.strip()) --- 首先s.strip()去掉首位空格,然后匹配任意空白字符(這里主要是通過空格區(qū)分不同字母,當然這里不會對最后的.進行分割的,這里的.歸屬與與它前面相鄰的字母)reverse() --- 對列表的元素進行反向排序' '.join(t) --- 將序列中的元素以指定的字符連接生成一個新的字符串用到的正則表達式: \s --- 匹配任意空白字符,包括空格、制表符、換頁符,與[\f\n\r\t\v]等效
4.編寫程序,使用正則表達式提取另一個Python程序中的所有函數(shù)名。
import re fileName = input('請輸入一個 Python 程序文件名:') pattern = r'def (\w+)' funcNames = [] with open(fileName, encoding='utf8') as fp:for line in fp:result = re.findall(pattern, line)#findall(pattern,string[,flag])返回包含字符串中所有的與給定模式匹配的項的列表if result:funcNames.extend(result) print(funcNames) 該程序分析過幾天會更新的
5.假設(shè)有一句英文,其中某個單詞中有個不在兩端的字母誤寫作大寫,編寫程序使用正則表達式進行檢查和糾正為小寫。注意不要影響每個單詞兩端的字母。

主要通過sub,將真?zhèn)€英文句子中分成三部分,開頭、中間、結(jié)尾,其中處理中間部分時,通過lower()方法處理一下即可

import re def checkModify(s):return re.sub(r'\b(\w)(\w+)(\w)\b',lambda x:x.group(1)+x.group(2).lower()+x.group(3),s) print(checkModify('aBc ABBC D eeee fFFFfF'))

運行效果如下:

分析: 代碼關(guān)鍵有這一個:sub(r'\b(\w)(\w+)(\w)\b',lambda x:x.group(1)+x.group(2).lower()+x.group(3),s) 主要是sub的三個參數(shù),現(xiàn)在開始分解,一個一個解釋:sub(pat,repl,string[,count=0]) 將字符串中所有與pat匹配的項,用repl替換,返回新字符串,repl可以是字符串或返回字符串的可調(diào)用對象,作用于每個匹配的match對象\b(\w)(\w+)(\w)\b 很簡單也就是先看兩端即匹配時以[a-zA-Z0-9]開頭和結(jié)尾,之間內(nèi)容也是[a-zA-Z0-9],其中里面有三個子模式,開頭(group(1))、中間(group(2))、結(jié)尾(group(3))。lambda x:x.group(1)+x.group(2).lower()+x.group(3) 這里的含義就是此時的x為x.group(1)+x.group(2).lower()+x.group(3),也就是將中間的內(nèi)容字符串中所有大寫字符為小寫,首尾的字符串不動(其中字符串的分割是以非[a-zA-Z0-9]為分割符的,該題主要是以空格為分隔符)lower()方法 轉(zhuǎn)換字符串中所有大寫字符為小寫用到的正則表達式: r‘xxxx’ --- 單引號里面的xxx原樣對待 \b --- 匹配單詞頭或單詞尾 \w --- 匹配任意字母、數(shù)字、以及下劃線,相當于[a-zA-Z0-9] () --- 將位于()中的內(nèi)容作為一個整體對待,表示一個子模式
6.編寫程序,使用正則表達式提取另一個Python程序中的所有變量名。
import re fileName = input('請輸入一個 Python 程序文件名:') patterns = (r'(.+?)\s=',r'for (.+?) in',r'def \w+?\((.*?)\)',r' as (\w+?):') funcNames = [] with open(fileName, encoding='utf8') as fp:for line in fp:line = line.strip()for p in patterns:t = re.findall(p, line)if t:for item in t:funcNames.extend(item.split(',')) print(funcNames) 分析: 代碼關(guān)鍵有這些個: findall(pattern,string[,flag]) --- 返回包含字符串中所有的與給定模式匹配的項的列表 findall(p, line) --- 匹配line字符串中的p,其中p為 r'(.+?)\s=',r'for (.+?) in',r'def \w+?\((.*?)\)',r' as (\w+?):' strip()方法 移除字符串頭尾指定的字符(默認為空格或換行符)或字符序列用到的正則表達式: r‘xxxx’ --- 單引號里面的xxx原樣對待 () --- 將位于()中的內(nèi)容作為一個整體對待,表示一個子模式 \w --- 匹配任意字母、數(shù)字、以及下劃線,相當于[a-zA-Z0-9] ? --- 匹配位于?之前的0個或1個字符 + --- 匹配位于+之前的字符或子模塊的1次或多次的出現(xiàn) . --- 匹配除換行符以外的任意單個字符 * --- 匹配位于*之前的字符或子模式0次或多次出現(xiàn)

總結(jié)

以上是生活随笔為你收集整理的Python---正则表达式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。