Python---正则表达式
正則表達(dá)式的基本語(yǔ)法我這里就不再敘述了,網(wǎng)上一大堆,我就不一一列舉了,用到的正則表達(dá)式我會(huì)在分析中列舉。
1. 寫(xiě)一個(gè)正則表達(dá)式判斷一個(gè)字符串是否是ipv4地址。規(guī)則:一個(gè)ip地址由4個(gè)數(shù)字組成,每個(gè)數(shù)字之間用.連接。每個(gè)數(shù)字的大小是0-255 例如:255.189.10.37 正確,256.189.89.9 錯(cuò)誤。
思路:首先可知ip是由四部分組成,但是前三部分可以同樣對(duì)待,最后一個(gè)由于少一個(gè). 故分開(kāi)對(duì)待處理。而且每個(gè)數(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)運(yùn)行效果圖如下:
運(yùn)行效果圖如下:
2.使用正則表達(dá)式查找文本中最長(zhǎng)的數(shù)字字符串。
首先,分兩種方法通過(guò)兩個(gè)不同的函數(shù)來(lái)實(shí)現(xiàn)。longest1(s):查找所有連續(xù)數(shù)字 、longest2(s):使用非數(shù)字作為分隔符。其中查找所有連續(xù)數(shù)字是\d來(lái)處理分割的、而使用非數(shù)字作為分隔符則通過(guò)[^\d]來(lái)分割實(shí)現(xiàn)的
import re def longest1(s):#查找所有連續(xù)數(shù)字t = re.findall('\d+',s)#findall(pattern,string[,flag])返回包含字符串中所有的與給定模式匹配的項(xiàng)的列表#print(t) #['123456789', '123', '456789']print(max(t,key = len))#max函數(shù)有兩個(gè)參數(shù):一個(gè)可迭代對(duì)象(a)和一個(gè)可選的“key”函數(shù)。 Key功能將用于評(píng)估a中最大的項(xiàng)目的值。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ù)模式匹配項(xiàng)分隔字符串#print(t) #['123456789', '', '123', '', '456789']if t:return max(t,key = len)return -1m = "123456789ss123dd456789"print(longest1(m)) print(longest2(m))效果圖如下:
3.將一句英語(yǔ)文本中的單詞進(jìn)行倒置,標(biāo)點(diǎn)不倒置,假設(shè)單詞之間使用一個(gè)或多個(gè)空格進(jìn)行分割。比如I like beijing. 經(jīng)過(guò)函數(shù)后變?yōu)?#xff1a;beijing. like I。
首先,通過(guò)\s分割,分割之后存放到一個(gè)列表中,然后通過(guò)反轉(zhuǎn)輸出即可。這里為了格式的需求通過(guò).join(t)以空格為分割來(lái)進(jìn)行連接
import re def reverse(s):t = re.split("\s+",s.strip())#split(pattern,string[,maxsplit=0])根據(jù)模式匹配項(xiàng)分隔字符串t.reverse()#對(duì)列表的元素進(jìn)行反向排序return ' '.join(t)#將序列中的元素以指定的字符連接生成一個(gè)新的字符串,這里是通過(guò)空格來(lái)連接t這個(gè)列表中的所有元素 print(reverse('I like beijing.')) print(reverse('Simple is better than complex.'))效果圖如下:
4.編寫(xiě)程序,使用正則表達(dá)式提取另一個(gè)Python程序中的所有函數(shù)名。
import re fileName = input('請(qǐng)輸入一個(gè) 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])返回包含字符串中所有的與給定模式匹配的項(xiàng)的列表if result:funcNames.extend(result) print(funcNames) 該程序分析過(guò)幾天會(huì)更新的5.假設(shè)有一句英文,其中某個(gè)單詞中有個(gè)不在兩端的字母誤寫(xiě)作大寫(xiě),編寫(xiě)程序使用正則表達(dá)式進(jìn)行檢查和糾正為小寫(xiě)。注意不要影響每個(gè)單詞兩端的字母。
主要通過(guò)sub,將真?zhèn)€英文句子中分成三部分,開(kāi)頭、中間、結(jié)尾,其中處理中間部分時(shí),通過(guò)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'))運(yùn)行效果如下:
6.編寫(xiě)程序,使用正則表達(dá)式提取另一個(gè)Python程序中的所有變量名。
import re fileName = input('請(qǐng)輸入一個(gè) 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)鍵有這些個(gè): findall(pattern,string[,flag]) --- 返回包含字符串中所有的與給定模式匹配的項(xiàng)的列表 findall(p, line) --- 匹配line字符串中的p,其中p為 r'(.+?)\s=',r'for (.+?) in',r'def \w+?\((.*?)\)',r' as (\w+?):' strip()方法 移除字符串頭尾指定的字符(默認(rèn)為空格或換行符)或字符序列用到的正則表達(dá)式: r‘xxxx’ --- 單引號(hào)里面的xxx原樣對(duì)待 () --- 將位于()中的內(nèi)容作為一個(gè)整體對(duì)待,表示一個(gè)子模式 \w --- 匹配任意字母、數(shù)字、以及下劃線,相當(dāng)于[a-zA-Z0-9] ? --- 匹配位于?之前的0個(gè)或1個(gè)字符 + --- 匹配位于+之前的字符或子模塊的1次或多次的出現(xiàn) . --- 匹配除換行符以外的任意單個(gè)字符 * --- 匹配位于*之前的字符或子模式0次或多次出現(xiàn)總結(jié)
以上是生活随笔為你收集整理的Python---正则表达式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: DNF高级强化
- 下一篇: Python---实验八