最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python正則表達(dá)式(更長(zhǎng)的正則表達(dá)式示例)示例代碼

 更新時(shí)間:2025年12月25日 10:29:11   作者:鋼鐵男兒  
正則表達(dá)式是一種強(qiáng)大的文本模式匹配工具,被廣泛應(yīng)用于字符串的搜索、替換、驗(yàn)證等場(chǎng)景,這篇文章主要介紹了Python正則表達(dá)式(更長(zhǎng)的正則表達(dá)式示例)的相關(guān)資料,需要的朋友可以參考下

更長(zhǎng)的正則表達(dá)式示例

我們現(xiàn)在將瀏覽一個(gè)深入的示列,它以不同的方式使用正則表達(dá)式來(lái)操作字符串。首先是一些實(shí)際上生成用于操作隨機(jī)數(shù)(但不是太隨機(jī))的代碼。示例1-5 展示了gendata.py,這是一個(gè)生成數(shù)據(jù)集的腳本。盡管該程序只是將簡(jiǎn)單地將生成的字符串集顯示到標(biāo)準(zhǔn)輸出,但是該輸出可以很容易重定向到測(cè)試文件。

示例1-5 用于正則表達(dá)式練習(xí)的數(shù)據(jù)生成器(gendata.py)

該腳本為正則表達(dá)式練習(xí)創(chuàng)建隨機(jī)數(shù)據(jù),然后將生成的數(shù)據(jù)輸出到屏幕。要將該程序移植到Python 3,僅需要將print 語(yǔ)句修改為函數(shù),將xrange()函數(shù)修改為range(),以及將sys.maxint 修改為sys.maxsize。

from random import randrange,choice
from string import ascii_lowercase as lc
from sys import maxint
from time import ctime

tlds=('com','edu','net','org','gov')

for i in xrange(randrange(5,11)):
    dtint=randrange(maxint) #pick date
    dtstr=ctime(dtint)      #date string
    llen=randrange(4,8)     #login is shorter
    login=''.join(choice(lc) for j in range(llen))
    dlen=randrange(llen,13) #domain is longer
    dom=''.join(choice(lc) for j in xrange(dlen))
    print('%s::%s@%s.%s::%d-%d-%d' % (dtstr,login,
                                      dom,choice(tlds),dtint,llen,dlen))

該腳本生成擁有三個(gè)字段的字符串,由一對(duì)冒號(hào)或者一對(duì)雙冒號(hào)分隔。第一個(gè)字段是隨機(jī)(32 位)整數(shù),該整數(shù)將被轉(zhuǎn)換為一個(gè)日期。下一個(gè)字段是一個(gè)隨機(jī)生成的電子郵件地址。

最后一個(gè)字段是一個(gè)由單橫線(-)分隔的整數(shù)集。

運(yùn)行這段代碼,我們將獲得以下輸出(讀者將會(huì)從此獲益頗多),并將該輸出在本地另存為redata.txt 文件。

Thu Jul 22 19:21:19 2004::izsp@dicqdhytvhv.edu::1090549279-4-11
Sun Jul 13 22:42:11 2008::zqeu@dxaibjgkniy.com::1216014131-4-11
Sat May 5 16:36:23 1990::fclihw@alwdbzpsdg.edu::641950583-6-10
Thu Feb 15 17:46:04 2007::uzifzf@dpyivihw.gov::1171590364-6-8
Thu Jun 26 19:08:59 2036::ugxfugt@jkhuqhs.net::2098145339-7-7
Tu e Apr 10 01:04:45 2012::zkwaq@rpxwmtikse.com::1334045085-5-10

讀者或者可能會(huì)辨別出來(lái),但是來(lái)自該程序的輸出是為正則表達(dá)式處理做準(zhǔn)備的。后續(xù)將逐
行解釋,我們將實(shí)現(xiàn)一些正則表達(dá)式來(lái)操作這些數(shù)據(jù),以及為本章末尾的練習(xí)留下很多內(nèi)容。

匹配字符串

對(duì)于后續(xù)的練習(xí),為正則表達(dá)式創(chuàng)建寬松和約束性的版本。建議讀者在一個(gè)簡(jiǎn)短的應(yīng)用中測(cè)試這些正則表達(dá)式,該應(yīng)用利用之前所展示的示例文件redata.txt(或者使用通過(guò)運(yùn)行g(shù)endata.py 生成的數(shù)據(jù))。當(dāng)做練習(xí)時(shí),讀者將需要再次使用該數(shù)據(jù)。

在將正則表達(dá)式放入應(yīng)用中之前,為了測(cè)試正則表達(dá)式,我們將導(dǎo)入re 模塊,然后將redata.txt 中的一個(gè)示例行賦給字符串變量data。如下所示,這些語(yǔ)句在所有展示的示例中都是常量。

>>> import re
>> > data = 'Thu Feb 15 17:46:04 2007::uzifzf@dpyivihw.gov::1171590364-6-8'

在第一個(gè)示例中,我們將創(chuàng)建一個(gè)正則表達(dá)式來(lái)提取(僅僅)數(shù)據(jù)文件redata.txt 中每一行時(shí)間戳中一周的幾天。我們將使用下面的正則表達(dá)式。

"^ Mon|^Tue|^Wed|^Thu|^Fri|^Sat|^Sun"

該示例需要字符串以列出的7 個(gè)字符串中的任意一個(gè)開(kāi)頭(“^”正則表達(dá)式中的脫字符)。

如果我們將該正則表達(dá)式“翻譯”成自然語(yǔ)言,讀起來(lái)就會(huì)像這樣:“字符串應(yīng)當(dāng)以“Mon”,“Tue”,. . . ,“Sat”或者“Sun”開(kāi)頭。

換句話說(shuō),如果按照如下所示的方式對(duì)日期字符串分組,我們就可以使用一個(gè)脫字符來(lái)替換所有脫字符。

"^ (Mon|Tue|Wed|Thu|Fri|Sat|Sun)"

括住字符串集的圓括號(hào)意思是:這些字符串中的一個(gè)將會(huì)有一次成功匹配。這是我們一開(kāi)始就使用的“友好的”正則表達(dá)式版本,該版本并沒(méi)有使用圓括號(hào)。如下所示,在這個(gè)修改過(guò)的正則表達(dá)式版本中,可以以子組的方式來(lái)訪問(wèn)匹配字符串。

>>> patt = '^(Mon|Tue|Wed|Thu|Fri|Sat|Sun)'
>>> m = re.match(patt, data)
>>> m.group() # entire match
'Thu'
>>> m.group(1) # subgroup 1
'Thu'
>>> m.groups() # all subgroups
(' Thu',)

我們?cè)谠撌纠鶎?shí)現(xiàn)的這個(gè)特性可能看起來(lái)并不是革命性的,但是在下一個(gè)示例或者作為正則表達(dá)式的一部分提供額外數(shù)據(jù)來(lái)實(shí)現(xiàn)字符串匹配操作的任何地方,它確定有它的獨(dú)到之處,即使這些字符并不是你所感興趣字符的一部分。

以上兩個(gè)正則表達(dá)式都是非常嚴(yán)格的,尤其是要求一個(gè)字符串集。這可能在一個(gè)國(guó)際化的環(huán)境中并不能良好地工作,因?yàn)樗诘沫h(huán)境中會(huì)使用當(dāng)?shù)氐娜掌诤涂s寫(xiě)。一個(gè)寬松的正則表達(dá)式將為:^\w{3}。該正則表達(dá)式僅僅需要一個(gè)以三個(gè)連續(xù)字母數(shù)字字符開(kāi)頭的字符串。

再一次,將正則表達(dá)式轉(zhuǎn)換為正常的自然語(yǔ)言:脫字符^表示“作為起始”,\w 表示任意單個(gè)字母數(shù)字字符,{3}表示將會(huì)有3 個(gè)連續(xù)的正則表達(dá)式副本,這里使用{3}來(lái)修飾正則表達(dá)式。

再一次,如果想要分組,就必須使用圓括號(hào),例如^(\w{3})。

>>> patt = '^(\w{3})'
>>> m = re.match(patt, data)
>>> if m is not None: m.group()
...
'Thu'
>>> m.group(1)
'T hu'

注意,正則表達(dá)式^(\w){3}是錯(cuò)誤的。當(dāng){3}在圓括號(hào)中時(shí),先匹配三個(gè)連續(xù)的字母數(shù)字字符,然后表示為一個(gè)分組。但是如果將{3}移到外部,它就等效于三個(gè)連續(xù)的單個(gè)字母數(shù)字字符。

>>> patt = '^(\w){3}'
>>> m = re.match(patt, data)
>>> if m is not None: m.group()
...
'Thu'
>>> m.group(1)
'u '

當(dāng)我們?cè)L問(wèn)子組1 時(shí),出現(xiàn)字母“u”的原因是子組1 持續(xù)被下一個(gè)字符替換。換句話說(shuō),m.group(1)以字母“T”作為開(kāi)始,然后變?yōu)?ldquo;h”,最終被替換為“u”。這些是單個(gè)字母數(shù)字字符的三個(gè)獨(dú)立(并且重疊)分組,與一個(gè)包含三個(gè)連續(xù)字母數(shù)字字符的單獨(dú)分組相反。

在下一個(gè)(而且是最后)的示例中,我們將創(chuàng)建一個(gè)正則表達(dá)式來(lái)提取redata.txt 每一行的末尾所發(fā)現(xiàn)的數(shù)字字段。

搜索與匹配……還有貪婪

然而,在創(chuàng)建任何正則表達(dá)式之前,我們就意識(shí)到這些整數(shù)數(shù)據(jù)項(xiàng)位于數(shù)據(jù)字符串的末尾。這就意味著我們需要選擇使用搜索還是匹配。發(fā)起一個(gè)搜索將更易于理解,因?yàn)槲覀兇_切知道想要查找的內(nèi)容(包含三個(gè)整數(shù)的數(shù)據(jù)集),所要查找的內(nèi)容不是在字符串的起始部分,也不是整個(gè)字符串。如果我們想要實(shí)現(xiàn)匹配,就必須創(chuàng)建一個(gè)正則表達(dá)式來(lái)匹配整個(gè)行,然后使用子組來(lái)保存想要的數(shù)據(jù)。要展示它們之間的差別,就需要先執(zhí)行搜索,然后實(shí)現(xiàn)匹配,以展示使用搜索更適合當(dāng)前的需要。

因?yàn)槲覀兿胍獙ふ胰齻€(gè)由連字符分隔的整數(shù),所以可以創(chuàng)建自己的正則表達(dá)式來(lái)說(shuō)明這一需求:\d±\d±\d+。該正則表達(dá)式的含義是,“任何數(shù)值的數(shù)字(至少一個(gè))后面跟著一個(gè)連字符,然后是多個(gè)數(shù)字、另一個(gè)連字符,最后是一個(gè)數(shù)字集。”我們現(xiàn)在將使用search()來(lái)測(cè)試該正則表達(dá)式:

>>> patt = '\d+-\d+-\d+'
>>> re.search(patt, data).group() # entire match
'1 171590364-6-8'

一個(gè)匹配嘗試失敗了,為什么呢?因?yàn)槠ヅ鋸淖址钠鹗疾糠珠_(kāi)始,需要被匹配的數(shù)值位于字符串的末尾。我們將不得不創(chuàng)建另一個(gè)正則表達(dá)式來(lái)匹配整個(gè)字符串。但是可以使用惰性匹配,即使用“.+”來(lái)表明一個(gè)任意字符集跟在我們真正感興趣的部分之后。

patt = '.+\d+-\d+-\d+'
>>> re.match(patt, data).group() # entire match
'T hu Feb 15 17:46:04 2007::uzifzf@dpyivihw.gov::1171590364-6-8'

該正則表達(dá)式效果非常好,但是我們只想要末尾的數(shù)字字段,而并不是整個(gè)字符串,因此不得不使用圓括號(hào)對(duì)想要的內(nèi)容進(jìn)行分組。

>>> patt = '.+(\d+-\d+-\d+)'
>>> re.match(patt, data).group(1) # subgroup 1
'4 -6-8'

發(fā)生了什么?我們將提取1171590364-6-8,而不僅僅是4-6-8。第一個(gè)整數(shù)的其余部分在哪兒?問(wèn)題在于正則表達(dá)式本質(zhì)上實(shí)現(xiàn)貪婪匹配。這就意味著對(duì)于該通配符模式,將對(duì)正則表達(dá)式從左至右按順序求值,而且試圖獲取匹配該模式的盡可能多的字符。在之前的示例中,使用
“.+”獲取從字符串起始位置開(kāi)始的全部單個(gè)字符,包括所期望的第一個(gè)整數(shù)字段。\d+僅僅需要一個(gè)數(shù)字,因此將得到“4”,其中.+匹配了從字符串起始部分到所期望的第一個(gè)數(shù)字的全部?jī)?nèi)容:“Thu Feb 15 17:46:04 2007::uzifzf@dpyivihw.gov::117159036”,如圖1-2 所示。

其中的一個(gè)方案是使用“非貪婪”操作符“?”。讀者可以在“*”、“+”或者“?”之后使用該操作符。該操作符將要求正則表達(dá)式引擎匹配盡可能少的字符。因此,如果在“.+”之10后放置一個(gè)“?”,我們將獲得所期望的結(jié)果,如圖1-3 所示。

>>> patt = '.+?(\d+-\d+-\d+)'
>>> re.match(patt, data).group(1) # subgroup 1
'1171590364-6-8'

另一個(gè)實(shí)際情況下更簡(jiǎn)單的方案,就是把“::”作為字段分隔符。讀者可以僅僅使用正則字符串strip(‘:: ‘)方法獲取所有的部分,然后使用strip(’-’)作為另一個(gè)橫線分隔符,就能夠獲取最初想要查詢的三個(gè)整數(shù)。現(xiàn)在,我們不想先選擇該方案,因?yàn)檫@就是我們?nèi)绾螌⒆址旁谝黄穑允褂胓endata.py 作為開(kāi)始!

最后一個(gè)示例:假定我們僅想取出三個(gè)整數(shù)字段中間的那個(gè)整數(shù)。如下所示,這就是實(shí)現(xiàn)的方法(使用一個(gè)搜索,這樣就不必匹配整個(gè)字符串):-(\d+)-。嘗試該模式,將得到以下內(nèi)容。

>>> patt = '-(\d+)-'
>>> m = re.search(patt, data)
>>> m.group() # entire match
'-6-'
>>> m.group(1) # subgroup 1
'6 '

本章幾乎沒(méi)有涉及正則表達(dá)式的強(qiáng)大功能,在有限的篇幅里面我們不可能做到。然而,我們希望已經(jīng)向讀者提供了足夠有用的介紹性信息,使讀者能夠掌握這個(gè)強(qiáng)有力的工具,并融入到自己的編程技巧里面。建議讀者閱讀參考文檔以獲取在Python 中如何使用正則表達(dá)式
的更多細(xì)節(jié)。對(duì)于想要更深入研究正則表達(dá)式的讀者,建議閱讀由 Jeffrey E. F. Friedl.編寫(xiě)的Mastering Regular Expressions。

總結(jié)

到此這篇關(guān)于Python正則表達(dá)式的文章就介紹到這了,更多相關(guān)Python正則表達(dá)式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用C語(yǔ)言來(lái)擴(kuò)展Python程序和Zope服務(wù)器的教程

    使用C語(yǔ)言來(lái)擴(kuò)展Python程序和Zope服務(wù)器的教程

    這篇文章主要介紹了使用C語(yǔ)言來(lái)擴(kuò)展Python程序和Zope服務(wù)器的教程,本文來(lái)自于IBM官方網(wǎng)站技術(shù)文檔,需要的朋友可以參考下
    2015-04-04
  • Pycharm2020最新激活碼|永久激活(附最新激活碼和插件的詳細(xì)教程)

    Pycharm2020最新激活碼|永久激活(附最新激活碼和插件的詳細(xì)教程)

    這篇文章主要介紹了Pycharm2020最新激活碼|永久激活(附最新激活碼和插件的詳細(xì)教程),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Python中取整的幾種方法小結(jié)

    Python中取整的幾種方法小結(jié)

    這篇文章主要介紹了Python中取整的幾種方法,其中包括向下取整、四舍五入取整、向上取整以及分別取整數(shù)部分和小數(shù)部分。分別都給出了示例代碼,相信對(duì)大家的理解和學(xué)習(xí)具有一定的參考借鑒價(jià)值,需要的朋友可以參考借鑒。
    2017-01-01
  • Python(Pandas、Dask、PySpark等庫(kù))在大數(shù)據(jù)處理中的學(xué)習(xí)心得

    Python(Pandas、Dask、PySpark等庫(kù))在大數(shù)據(jù)處理中的學(xué)習(xí)心得

    作者分享了他對(duì)Python在大數(shù)據(jù)處理中的學(xué)習(xí)心得,介紹了大數(shù)據(jù)的概念、特點(diǎn)及處理挑戰(zhàn),討論了Python的優(yōu)勢(shì)及常用的大數(shù)據(jù)處理庫(kù),比較了Python與Rust在大數(shù)據(jù)處理中的優(yōu)劣,并提出了大數(shù)據(jù)處理的最佳實(shí)踐
    2026-04-04
  • python?中defaultdict()對(duì)字典進(jìn)行初始化的用法介紹

    python?中defaultdict()對(duì)字典進(jìn)行初始化的用法介紹

    這篇文章主要介紹了python?中defaultdict()對(duì)字典進(jìn)行初始化,一般情況下,在使用字典時(shí),先定義一個(gè)空字典(如dict_a?=?{}),然后往字典中添加元素只需要?dict_a[key]?=?value即可,本文通過(guò)實(shí)例代碼介紹具體用法,需要的朋友可以參考下
    2022-07-07
  • Python之re模塊詳解

    Python之re模塊詳解

    這篇文章主要介紹了Python編程之Re模塊下的函數(shù)介紹,還是比較不錯(cuò)的,這里分享給大家,供需要的朋友參考,希望能夠給你帶來(lái)幫助
    2021-09-09
  • 如何在Windows環(huán)境下安裝PyMySQL(已安裝Anaconda)

    如何在Windows環(huán)境下安裝PyMySQL(已安裝Anaconda)

    這篇文章主要介紹了如何在Windows環(huán)境下安裝PyMySQL問(wèn)題(已安裝Anaconda),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Python?Poetry實(shí)現(xiàn)高效依賴管理的新手指南

    Python?Poetry實(shí)現(xiàn)高效依賴管理的新手指南

    這篇文章主要為大家詳細(xì)介紹了Python如何使用Poetry實(shí)現(xiàn)高效依賴管理,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-05-05
  • 利用pandas將numpy數(shù)組導(dǎo)出生成excel的實(shí)例

    利用pandas將numpy數(shù)組導(dǎo)出生成excel的實(shí)例

    今天小編就為大家分享一篇利用pandas將numpy數(shù)組導(dǎo)出生成excel的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • 總結(jié)python爬蟲(chóng)抓站的實(shí)用技巧

    總結(jié)python爬蟲(chóng)抓站的實(shí)用技巧

    很多人學(xué)用python,用得最多的還是各類爬蟲(chóng)腳本:有寫(xiě)過(guò)抓代理本機(jī)驗(yàn)證的腳本,有寫(xiě)過(guò)自動(dòng)收郵件的腳本,還有寫(xiě)過(guò)簡(jiǎn)單的驗(yàn)證碼識(shí)別的腳本,那么我們今天就來(lái)總結(jié)下python爬蟲(chóng)抓站的一些實(shí)用技巧。
    2016-08-08

最新評(píng)論

凤翔县| 正宁县| 长沙市| 石景山区| 谢通门县| 禄丰县| 道真| 吴旗县| 布拖县| 汉源县| 盐亭县| 锦屏县| 泊头市| 兴义市| 三门县| 马关县| 阿尔山市| 东源县| 黄浦区| 泾川县| 西贡区| 濮阳市| 周宁县| 疏附县| 柳河县| 珠海市| 上高县| 吴桥县| 富平县| 安龙县| 将乐县| 武鸣县| 察隅县| 兴仁县| 文水县| 罗甸县| 沭阳县| 和田县| 施甸县| 东丽区| 宁波市|