国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

12.字符串和正則表達(dá)式

這篇具有很好參考價值的文章主要介紹了12.字符串和正則表達(dá)式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

使用正則表達(dá)式

正則表達(dá)式相關(guān)知識

在編寫處理字符串的程序或網(wǎng)頁時,經(jīng)常會有查找符合某些復(fù)雜規(guī)則的字符串的需要,正則表達(dá)式就是用于描述這些規(guī)則的工具,換句話說正則表達(dá)式是一種工具,它定義了字符串的匹配模式(如何檢查一個字符串是否有跟某種模式匹配的部分或者從一個字符串中將與模式匹配的部分提取出來或者替換掉)。如果你在Windows操作系統(tǒng)中使用過文件查找并且在指定文件名時使用過通配符(*和?),那么正則表達(dá)式也是與之類似的用來進(jìn)行文本匹配的工具,只不過比起通配符正則表達(dá)式更強大,它能更精確地描述你的需求(當(dāng)然你付出的代價是書寫一個正則表達(dá)式比打出一個通配符要復(fù)雜得多,要知道任何給你帶來好處的東西都是有代價的,就如同學(xué)習(xí)一門編程語言一樣),比如你可以編寫一個正則表達(dá)式,用來查找所有以0開頭,后面跟著2-3個數(shù)字,然后是一個連字號“-”,最后是7或8位數(shù)字的字符串(像028-12345678或0813-7654321),這不就是國內(nèi)的座機號碼嗎。最初計算機是為了做數(shù)學(xué)運算而誕生的,處理的信息基本上都是數(shù)值,而今天我們在日常工作中處理的信息基本上都是文本數(shù)據(jù),我們希望計算機能夠識別和處理符合某些模式的文本,正則表達(dá)式就顯得非常重要了。今天幾乎所有的編程語言都提供了對正則表達(dá)式操作的支持,Python通過標(biāo)準(zhǔn)庫中的re模塊來支持正則表達(dá)式操作。

我們可以考慮下面一個問題:我們從某個地方(可能是一個文本文件,也可能是網(wǎng)絡(luò)上的一則新聞)獲得了一個字符串,希望在字符串中找出手機號和座機號。當(dāng)然我們可以設(shè)定手機號是11位的數(shù)字(注意并不是隨機的11位數(shù)字,因為你沒有見過“25012345678”這樣的手機號吧)而座機號跟上一段中描述的模式相同,如果不使用正則表達(dá)式要完成這個任務(wù)就會很麻煩。

關(guān)于正則表達(dá)式的相關(guān)知識,大家可以閱讀一篇非常有名的博客叫《正則表達(dá)式30分鐘入門教程》,讀完這篇文章后你就可以看懂下面的表格,這是我們對正則表達(dá)式中的一些基本符號進(jìn)行的扼要總結(jié)。

符號 解釋 示例 說明
. 匹配任意字符 b.t 可以匹配bat / but / b#t / b1t等
\w 匹配字母/數(shù)字/下劃線 b\wt 可以匹配bat / b1t / b_t等
但不能匹配b#t
\s 匹配空白字符(包括\r、\n、\t等) love\syou 可以匹配love you
\d 匹配數(shù)字 \d\d 可以匹配01 / 23 / 99等
\b 匹配單詞的邊界 \bThe\b
^ 匹配字符串的開始 ^The 可以匹配The開頭的字符串
$ 匹配字符串的結(jié)束 .exe$ 可以匹配.exe結(jié)尾的字符串
\W 匹配非字母/數(shù)字/下劃線 b\Wt 可以匹配b#t / b@t等
但不能匹配but / b1t / b_t等
\S 匹配非空白字符 love\Syou 可以匹配love#you等
但不能匹配love you
\D 匹配非數(shù)字 \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的位置
*? 重復(fù)任意次,但盡可能少重復(fù) a.*b
a.*?b
將正則表達(dá)式應(yīng)用于aabab,前者會匹配整個字符串a(chǎn)abab,后者會匹配aab和ab兩個字符串
+? 重復(fù)1次或多次,但盡可能少重復(fù)
?? 重復(fù)0次或1次,但盡可能少重復(fù)
{M,N}? 重復(fù)M到N次,但盡可能少重復(fù)
{M,}? 重復(fù)M次以上,但盡可能少重復(fù)

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

Python對正則表達(dá)式的支持

Python提供了re模塊來支持正則表達(dá)式相關(guān)操作,下面是re模塊中的核心函數(shù)。

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

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

下面我們通過一系列的例子來告訴大家在Python中如何使用正則表達(dá)式。

例子1:驗證輸入用戶名和QQ號是否有效并給出對應(yīng)的提示信息。
"""
驗證輸入用戶名和QQ號是否有效并給出對應(yīng)的提示信息

要求:用戶名必須由字母、數(shù)字或下劃線構(gòu)成且長度在6~20個字符之間,QQ號是5~12的數(shù)字且首位不能為0
"""
import re


def main():
    username = input('請輸入用戶名: ')
    qq = input('請輸入QQ號: ')
    # match函數(shù)的第一個參數(shù)是正則表達(dá)式字符串或正則表達(dá)式對象
    # 第二個參數(shù)是要跟正則表達(dá)式做匹配的字符串對象
    m1 = re.match(r'^[0-9a-zA-Z_]{6,20}$', username)
    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()

提示: 上面在書寫正則表達(dá)式時使用了“原始字符串”的寫法(在字符串前面加上了r),所謂“原始字符串”就是字符串中的每個字符都是它原始的意義,說得更直接一點就是字符串中沒有所謂的轉(zhuǎn)義字符啦。因為正則表達(dá)式中有很多元字符和需要進(jìn)行轉(zhuǎn)義的地方,如果不使用原始字符串就需要將反斜杠寫作\\,例如表示數(shù)字的\d得書寫成\\d,這樣不僅寫起來不方便,閱讀的時候也會很吃力。

例子2:從一段文字中提取出國內(nèi)手機號碼。

下面這張圖是截止到2017年底,國內(nèi)三家運營商推出的手機號段。

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

import re


def main():
    # 創(chuàng)建正則表達(dá)式對象 使用了前瞻和回顧來保證手機號前后不應(yīng)該出現(xiàn)數(shù)字
    pattern = re.compile(r'(?<=\D)1[34578]\d{9}(?=\D)')
    sentence = '''
    重要的事情說8130123456789遍,我的手機號是13512346789這個靚號,
    不是15600998765,也是110或119,王大錘的手機號才是15600998765。
    '''
    # 查找所有匹配并保存到一個列表中
    mylist = re.findall(pattern, sentence)
    print(mylist)
    print('--------華麗的分隔線--------')
    # 通過迭代器取出匹配對象并獲得匹配的內(nèi)容
    for temp in pattern.finditer(sentence):
        print(temp.group())
    print('--------華麗的分隔線--------')
    # 通過search函數(shù)指定搜索位置找出所有匹配
    m = pattern.search(sentence)
    while m:
        print(m.group())
        m = pattern.search(sentence, m.end())


if __name__ == '__main__':
    main()

說明: 上面匹配國內(nèi)手機號的正則表達(dá)式并不夠好,因為像14開頭的號碼只有145或147,而上面的正則表達(dá)式并沒有考慮這種情況,要匹配國內(nèi)手機號,更好的正則表達(dá)式的寫法是:(?<=\D)(1[38]\d{9}|14[57]\d{8}|15[0-35-9]\d{8}|17[678]\d{8})(?=\D),國內(nèi)最近好像有19和16開頭的手機號了,但是這個暫時不在我們考慮之列。

例子3:替換字符串中的不良內(nèi)容
import re


def main():
    sentence = '你丫是傻叉嗎? 我操你大爺?shù)? Fuck you.'
    purified = re.sub('[操肏艸]|fuck|shit|傻[比屄逼叉缺吊屌]|煞筆',
                      '*', sentence, flags=re.IGNORECASE)
    print(purified)  # 你丫是*嗎? 我*你大爺?shù)? * you.


if __name__ == '__main__':
    main()

說明: re模塊的正則表達(dá)式相關(guān)函數(shù)中都有一個flags參數(shù),它代表了正則表達(dá)式的匹配標(biāo)記,可以通過該標(biāo)記來指定匹配時是否忽略大小寫、是否進(jìn)行多行匹配、是否顯示調(diào)試信息等。如果需要為flags參數(shù)指定多個值,可以使用按位或運算符進(jìn)行疊加,如flags=re.I | re.M。

例子4:拆分長字符串
import re


def main():
    poem = '窗前明月光,疑是地上霜。舉頭望明月,低頭思故鄉(xiāng)。'
    sentence_list = re.split(r'[,。, .]', poem)
    while '' in sentence_list:
        sentence_list.remove('')
    print(sentence_list)  # ['窗前明月光', '疑是地上霜', '舉頭望明月', '低頭思故鄉(xiāng)']


if __name__ == '__main__':
    main()

后話

如果要從事爬蟲類應(yīng)用的開發(fā),那么正則表達(dá)式一定是一個非常好的助手,因為它可以幫助我們迅速的從網(wǎng)頁代碼中發(fā)現(xiàn)某種我們指定的模式并提取出我們需要的信息,當(dāng)然對于初學(xué)者來收,要編寫一個正確的適當(dāng)?shù)恼齽t表達(dá)式可能并不是一件容易的事情(當(dāng)然有些常用的正則表達(dá)式可以直接在網(wǎng)上找找),所以實際開發(fā)爬蟲應(yīng)用的時候,有很多人會選擇Beautiful Soup或Lxml來進(jìn)行匹配和信息的提取,前者簡單方便但是性能較差,后者既好用性能也好,但是安裝稍嫌麻煩,這些內(nèi)容我們會在后期的爬蟲專題中為大家介紹。文章來源地址http://www.zghlxwxcb.cn/news/detail-792157.html

到了這里,關(guān)于12.字符串和正則表達(dá)式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Python字符串驗證與正則表達(dá)式【第23篇—python基礎(chǔ)】

    Python字符串驗證與正則表達(dá)式【第23篇—python基礎(chǔ)】

    隨著Python在數(shù)據(jù)處理和字符串操作方面的廣泛應(yīng)用,對字符串進(jìn)行驗證以確保其僅包含字母變得愈發(fā)重要。在本文中,我們將深入探討Python中多種方法,用于檢查字符串是否只由字母組成,并且將關(guān)注這些方法的應(yīng)用場景以及它們的優(yōu)缺點。 在數(shù)據(jù)處理和文本挖掘中,對字符

    2024年01月17日
    瀏覽(62)
  • (python)正則表達(dá)式提取字符串中的各種信息(持續(xù)更新)

    ? ? ? ? 在日常數(shù)據(jù)處理過程,拿到一段文字,進(jìn)行關(guān)鍵信息的提取.總而言之,翻來覆去地用到幾種處理方法.這些都需要用到正則去進(jìn)行通用處理.比如提取關(guān)鍵信息,諸如時間,日期,地址等. 那么我們要根據(jù)關(guān)鍵信息的特征去提取. 數(shù)字提?。嚎梢杂谜齽t表達(dá)式來提取數(shù)字,包括整

    2024年01月24日
    瀏覽(26)
  • Python零基礎(chǔ)入門(六)——超詳細(xì)的字符串與正則表達(dá)式

    Python零基礎(chǔ)入門(六)——超詳細(xì)的字符串與正則表達(dá)式

    個人簡介:機電專業(yè)在讀研究生,CSDN內(nèi)容合伙人,博主個人首頁 Python入門專欄:《Python入門》歡迎閱讀,一起進(jìn)步!?????? 碼字不易,如果覺得文章不錯或能幫助到你學(xué)習(xí),可以點贊??收藏??評論??+關(guān)注哦!?????? 歡迎來到本系列教程的第六篇,之前的文章已經(jīng)介

    2024年02月13日
    瀏覽(29)
  • 【自然語言處理】NLP入門(一):1、正則表達(dá)式與Python中的實現(xiàn)(1):字符串構(gòu)造、字符串截取

    【自然語言處理】NLP入門(一):1、正則表達(dá)式與Python中的實現(xiàn)(1):字符串構(gòu)造、字符串截取

    ?? 語言 是一種使用具有共同處理規(guī)則的溝通指令的廣義概念,這些指令可以通過視覺、聲音或觸覺等方式傳遞。語言可以分為自然語言、動物語言和計算機語言。 ?? 自然語言 是人類發(fā)展過程中形成的一種信息交流方式,它包括口語和書面語,并且反映了人類的思想。

    2024年03月12日
    瀏覽(90)
  • java之字符串與正則表達(dá)式

    java之字符串與正則表達(dá)式

    目錄 String 構(gòu)造方法 注意 格式控制字符串 常用方法 StringBuilder與StringBuffer 特點 理解可變與不可變 字符串拼接方法 字符串刪除方法 字符串內(nèi)插入字符 字符串替換方法 字符串反轉(zhuǎn)方法 查字符串對應(yīng)索引處的字符? 截取字符串 正則表達(dá)式 正則表達(dá)式符號表 正則表達(dá)式常用方

    2023年04月22日
    瀏覽(25)
  • notepad++ 正則表達(dá)式查找特定字符串

    批量文本的處理方法 在報文中有很多指標(biāo)和值都具有固定的格式,比如是? a=\\\"1\\\" 這類格式,那么我們只取前面的指標(biāo)a,就會比較復(fù)雜,而使用正則表達(dá)式就會快樂許多! 采用以下第二種方法 查找目標(biāo) =(.+?)\\\"? ? 表示查找以等號開頭,引號和空格? 結(jié)尾的字符串,可以避免查

    2024年02月15日
    瀏覽(23)
  • 正則表達(dá)式中 “$” 并不是表示 “字符串結(jié)束

    作者:Seth Larson 譯者:豌豆花下貓@Python貓 英文:Regex character “$” doesn\\\'t mean “end-of-string” 轉(zhuǎn)載請保留作者及譯者信息! 這篇文章寫一寫我最近在用 Python 的正則表達(dá)式模塊( re )開發(fā) CPython 的 SBOM 工具時發(fā)現(xiàn)的一個令人驚訝的行為。 如果用過正則表達(dá)式,你可能知道 ^

    2024年04月15日
    瀏覽(26)
  • 【動態(tài)規(guī)劃】【字符串】C++算法:正則表達(dá)式匹配

    【動態(tài)規(guī)劃】【字符串】C++算法:正則表達(dá)式匹配

    視頻算法專題 動態(tài)規(guī)劃匯總 字符串 給你一個字符串 s 和一個字符規(guī)律 p,請你來實現(xiàn)一個支持 ‘.’ 和 ‘ ’ 的正則表達(dá)式匹配。 ‘.’ 匹配任意單個字符 \\\' ’ 匹配零個或多個前面的那一個元素 所謂匹配,是要涵蓋 整個 字符串 s的,而不是部分字符串。 示例 1: 輸入:

    2024年02月03日
    瀏覽(38)
  • 【深入理解ES6】字符串和正則表達(dá)式

    字符串(String)是JavaScript6大原始數(shù)據(jù)類型。其他幾個分別是Boolean、Null、Undefined、Number、Symbol(es6新增)。 字符串里的字符有兩種: 前??個碼位均以16位的編碼單元表示的BMP字符(基本多文種平面。 超過??的UTF-16引入了代理對,以兩個編碼單元32位表示輔助平面字符。 ES5中

    2024年02月13日
    瀏覽(26)
  • 使用正則表達(dá)式 移除 HTML 標(biāo)簽后得到字符串

    使用正則表達(dá)式 移除 HTML 標(biāo)簽后得到字符串

    在上述代碼中,stripHTMLTags 函數(shù)使用正則表達(dá)式 /[^]+/g 來匹配所有的 HTML 標(biāo)簽,并使用空字符串進(jìn)行替換,從而將 HTML 標(biāo)簽移除。 最后,返回移除 HTML 標(biāo)簽后的字符串。

    2024年02月14日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包