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

詳解Python中的文本處理

 更新時(shí)間:2015年04月11日 16:37:10   投稿:goldensun  
這篇文章主要介紹了Python中的文本處理,包括從最基本的string模塊的基礎(chǔ)使用和更進(jìn)一步的re模塊的使用,本文來自IBM官方開發(fā)者技術(shù)文檔,需要的朋友可以參考下

字符串 -- 不可改變的序列

如同大多數(shù)高級(jí)編程語言一樣,變長(zhǎng)字符串是 Python 中的基本類型。Python 在“后臺(tái)”分配內(nèi)存以保存字符串(或其它值),程序員不必為此操心。Python 還有一些其它高級(jí)語言沒有的字符串處理功能。

在 Python 中,字符串是“不可改變的序列”。盡管不能“按位置”修改字符串(如字節(jié)組),但程序可以引用字符串的元素或子序列,就象使用任何序列一樣。Python 使用靈活的“分片”操作來引用子序列,字符片段的格式類似于電子表格中一定范圍的行或列。以下交互式會(huì)話說明了字符串和字符片段的的用法:
字符串和分片

>>> s = 
    "mary had a little lamb"
>>> s[0] 
    # index is zero-based

    'm'
>>> s[3] = 
    'x' 
    # changing element in-place fails
Traceback (innermost last):
 File 
    "<stdin>", line 1, 
    in
     ?
TypeError: object doesn't support item assignment
>>> s[11:18] 
    # 'slice' a subsequence

    'little '
>>> s[:4] 
    # empty slice-begin assumes zero

    'mary'
>>> s[4] 
    # index 4 is not included in slice [:4]

    ' '
>>> s[5:-5] 
    # can use "from end" index with negatives

    'had a little'
>>> s[:5]+s[5:] 
    # slice-begin & slice-end are complimentary

    'mary had a little lamb'

另一個(gè)功能強(qiáng)大的字符串操作就是簡(jiǎn)單的 in 關(guān)鍵字。它提供了兩個(gè)直觀有效的構(gòu)造:
in 關(guān)鍵字

>>> s = 
    "mary had a little lamb"
>>> 
    for
     c 
    in
     s[11:18]: 
    print
     c, 
    # print each char in slice
...
l i t t l e
>>> 
    if
    'x' 
    in
     s: 
    print
    'got x' 
    # test for char occurrence
...
>>> 
    if
    'y' 
    in
     s: 
    print
    'got y' 
    # test for char occurrence
...
got y

在 Python 中,有幾種方法可以構(gòu)成字符串文字??梢允褂脝我?hào)或雙引號(hào),只要左引號(hào)和右引號(hào)匹配,常用的還有其它引號(hào)的變化形式。如果字符串包含換行符或嵌入引號(hào),三重引號(hào)可以很方便地定義這樣的字符串,如下例所示:
三重引號(hào)的使用

>>> s2 = 
    """Mary had a little lamb
... its fleece was white as snow
... and everywhere that Mary went
... the lamb was sure to go"""
>>> 
    print
     s2
Mary had a little lamb
its fleece was white as snow
    and
     everywhere that Mary went
the lamb was sure to go

使用單引號(hào)或三重引號(hào)的字符串前面可以加一個(gè)字母 "r" 以表示 Python 不應(yīng)該解釋規(guī)則表達(dá)式特殊字符。例如:
使用 "r-strings"

>>> s3 = 
    "this \n and \n that"
>>> 
    print
     s3
this
    and

    that
>>> s4 = r
    "this \n and \n that"
>>> 
    print
     s4
this \n 
    and
     \n that

在 "r-strings" 中,可能另外組成換碼符的反斜杠被當(dāng)作是常規(guī)反斜杠。在以后的規(guī)則表達(dá)式討論中會(huì)進(jìn)一步說明這個(gè)話題。

文件和字符串變量

我們談到“文本處理”時(shí),我們通常是指處理的內(nèi)容。Python 將文本文件的內(nèi)容讀入可以操作的字符串變量非常容易。文件對(duì)象提供了三個(gè)“讀”方法: .read()、.readline() 和 .readlines()。每種方法可以接受一個(gè)變量以限制每次讀取的數(shù)據(jù)量,但它們通常不使用變量。 .read() 每次讀取整個(gè)文件,它通常用于將文件內(nèi)容放到一個(gè)字符串變量中。然而 .read() 生成文件內(nèi)容最直接的字符串表示,但對(duì)于連續(xù)的面向行的處理,它卻是不必要的,并且如果文件大于可用內(nèi)存,則不可能實(shí)現(xiàn)這種處理。

.readline() 和 .readlines() 非常相似。它們都在類似于以下的結(jié)構(gòu)中使用:
Python .readlines() 示例

    fh = open(
    'c:\\autoexec.bat')
    for
     line 
    in
     fh.readlines():
 
    print
     line

.readline() 和 .readlines() 之間的差異是后者一次讀取整個(gè)文件,象 .read() 一樣。.readlines() 自動(dòng)將文件內(nèi)容分析成一個(gè)行的列表,該列表可以由 Python 的 for ... in ... 結(jié)構(gòu)進(jìn)行處理。另一方面,.readline() 每次只讀取一行,通常比 .readlines() 慢得多。僅當(dāng)沒有足夠內(nèi)存可以一次讀取整個(gè)文件時(shí),才應(yīng)該使用 .readline()。

如果正在使用處理文件的標(biāo)準(zhǔn)模塊,可以使用 cStringIO 模塊將字符串轉(zhuǎn)換成“虛擬文件”(如果需要生成模塊的子類,可以使用 StringIO 模塊,初學(xué)者未必要這樣做)。例如:
cStringIO 模塊

>>> 
    import
     cStringIO
>>> fh = cStringIO.StringIO()
>>> fh.write(
    "mary had a little lamb")
>>> fh.getvalue()
    'mary had a little lamb'
>>> fh.seek(5)
>>> fh.write(
    'ATE')
>>> fh.getvalue()
    'mary ATE a little lamb'

但是,請(qǐng)記住,cStringIO“虛擬文件”不是永久的,這一點(diǎn)與真正的文件不同。如果不保存它(如將它寫入一個(gè)真正的文件,或者使用 shelve 模塊或數(shù)據(jù)庫(kù)),則程序結(jié)束時(shí),它將消失。

標(biāo)準(zhǔn)模塊:string

string 模塊也許是 Python 1.5.* 標(biāo)準(zhǔn)發(fā)行版中最常用的模塊。實(shí)際上,在 Python 1.6 或更高版本中,string 模塊中的功能將作為內(nèi)置字符串方法(在撰寫本文時(shí),詳細(xì)信息尚未發(fā)布)。當(dāng)然,任何執(zhí)行文本處理任務(wù)的程序也許應(yīng)該用以下這行開頭:
開始使用 string 的方法

      import string

一般經(jīng)驗(yàn)法則告訴我們,如果 可以 使用 string 模塊完成任務(wù),那么那就是 正確 的方法。與 re(規(guī)則表達(dá)式)相比,string 函數(shù)通常更快速,大多數(shù)情況下他們更易于理解和維護(hù)。第三方 Python 模塊,包括某些用 C 編寫的快速模塊,適用于專門的任務(wù),但可移植性和熟悉性都建議只要可能就使用 string。如果您習(xí)慣于使用其它語言,也會(huì)有例外,但不如您想像的那樣多。

string 模塊包含了幾種類型的事物,如函數(shù)、方法和類;它還包含了公共常量的字符串。例如:
string 用法例 1

>>> 
    import
     string
>>> string.whitespace
    '\011\012\013\014\015 '
>>> string.uppercase
    'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

雖然可以用手寫出這些常量,string 版本或多或少確保了常量對(duì)于運(yùn)行 Python 腳本的國(guó)家語言和平臺(tái)將是正確的。

string 還包括了以常見方式(可以結(jié)合這些方式來構(gòu)成幾種罕見的轉(zhuǎn)換)轉(zhuǎn)換字符串的函數(shù)。例如:
string 用法例 2

>>> 
    import
     string
>>> s = 
    "mary had a little lamb"
>>> string.capwords(s)
    'Mary Had A Little Lamb'
>>> string.replace(s, 
    'little', 
    'ferocious')
    'mary had a ferocious lamb'

還有許多沒有在這里具體說明的其它轉(zhuǎn)換;可以在 Python 手冊(cè)中查找詳細(xì)信息。

還可以使用 string 函數(shù)來報(bào)告字符串屬性,如子串的長(zhǎng)度或位置,例如:
string 用法例 3

>>> 
    import
     string
>>> s = 
    "mary had a little lamb"
>>> string.find(s, 
    'had')5>>> string.count(s, 
    'a')4

最后,string 提供了非常 Python 化的奇特事物。.split() 和 .join() 對(duì)提供了在字符串和字節(jié)組之間轉(zhuǎn)換的迅捷方法,您會(huì)發(fā)現(xiàn)它們非常有用。用法很簡(jiǎn)單:
string 用法例 4

>>> 
    import
     string>>> s = 
    "mary had a little lamb"
>>> L = string.split(s)
>>> L
[
    'mary', 
    'had', 
    'a', 
    'little', 
    'lamb']
>>> string.join(L, 
    "-")
    'mary-had-a-little-lamb'

當(dāng)然,除了 .join() 之外,也許會(huì)利用列表來做其它事(如某些涉及我們熟悉的 for ... in ... 結(jié)構(gòu)的事情)。

標(biāo)準(zhǔn)模塊:re

re 模塊廢棄了在老的 Python 代碼中使用的 regex 和 regsub 模塊。雖然相對(duì)于 regex 仍然有幾個(gè)有限的優(yōu)點(diǎn),不過這些優(yōu)點(diǎn)微不足道,不值得在新代碼中使用。過時(shí)的模塊可能會(huì)從未來的 Python 發(fā)行版中刪除,并且 1.6 版可能有一個(gè)改進(jìn)的接口兼容的 re 模塊。所以,規(guī)則表達(dá)式仍將使用 re 模塊。

規(guī)則表達(dá)式很復(fù)雜。也許有人會(huì)撰寫關(guān)于這個(gè)主題的書,但實(shí)際上,已經(jīng)有許多人這樣做了!本文嘗試捕捉規(guī)則表達(dá)式的“完全形態(tài)”,讓讀者可以掌握它。

規(guī)則表達(dá)式是一種很簡(jiǎn)練方法,用于描述可能在文本中出現(xiàn)的模式。是否會(huì)出現(xiàn)某些字符?是否按特定順序出現(xiàn)?子模式是否會(huì)重復(fù)一定次數(shù)?其它子模式是否會(huì)排除在匹配之外?從概念上說,似乎不能用自然語言了直觀地描述模式。訣竅是使用規(guī)則表達(dá)式的簡(jiǎn)潔語法來編碼這種描述。

當(dāng)處理規(guī)則表達(dá)式時(shí),將它作為它自己的編程問題來處理,即使只涉及一或兩行代碼;這些行有效地構(gòu)成了一個(gè)小程序。

從最小處著手。從最基本上看,任何規(guī)則表達(dá)式都涉及匹配特定的“字符類”。最簡(jiǎn)單的字符類就是單個(gè)字符,它在模式中只是一個(gè)字。通常,您希望匹配一類字符??梢酝ㄟ^將類括在方括號(hào)內(nèi)來表明這是一個(gè)類;在括號(hào)中,可以有一組字符或者用破折號(hào)指定的字符范圍。還可以使用許多命名字符類來確定您的平臺(tái)和國(guó)家語言。以下是一些示例:
字符類

>>> 
    import
     re
>>> s = 
    "mary had a little lamb"
>>> 
    if
     re.search(
    "m", s): 
    print
    "Match!" 
    # char literal
Match!
>>> 
    if
     re.search(
    "[@A-Z]", s): 
    print
    "Match!" 
    # char class
... 
    # match either at-sign or capital letter
...
>>> 
    if
     re.search(
    "\d", s): 
    print
    "Match!" 
    # digits class
...

可以將字符類看作是規(guī)則表達(dá)式的“原子”,通常會(huì)將那些原子組合成“分子”。可以結(jié)合使用 分組和 循環(huán) 來完成此操作。由括號(hào)表示分組:括號(hào)中包含的任何子表達(dá)式都被看作是用于以后分組或循環(huán)的原子。循環(huán)則由以下幾個(gè)運(yùn)算符中的某一個(gè)來表示:"*" 表示“零或多”;"+" 表示“一或多”;"?" 表示“零或一”。例如,請(qǐng)看以下示例:
樣本規(guī)則表達(dá)式

ABC([d-w]*\d\d?)+XYZ

對(duì)于要匹配這個(gè)表達(dá)式的字符串,它必須以 "ABC" 開頭、以 "XYZ" 結(jié)尾 -- 但它的中間必須要有什么呢?中間子表達(dá)式是 ([d-w]*\d\d?),而且后面跟了“一或多”運(yùn)算符。所以,字符串的中間必須包括一個(gè)(或者兩個(gè),或者一千個(gè))與括號(hào)中的子表達(dá)式匹配的字符或字符串。字符串 "ABCXYZ" 不匹配,因?yàn)樗闹虚g沒有必要的字符。

不過這個(gè)內(nèi)部子表達(dá)式是什么呢?它以 d-w 范圍內(nèi)的 零或多個(gè) 字母開頭。一定要注意:零字母是有效匹配,雖然使用英語單詞 "some"(一些)來描述它,可能會(huì)感到很別扭。接著,字符串必須 恰好有一個(gè)數(shù)字;然后有 零或一個(gè) 附加數(shù)字。(第一個(gè)數(shù)字字符類沒有循環(huán)運(yùn)算符,所以它只出現(xiàn)一次。第二個(gè)數(shù)字字符類有 "?" 運(yùn)算符。)總而言之,這將翻譯成“一個(gè)或兩個(gè)數(shù)字”。以下是一些與規(guī)則表達(dá)式匹配的字符串:
匹配樣本表達(dá)式的字符串

ABC1234567890XYZ
ABCd12e1f37g3XYZ
ABC1XYZ

還有一些表達(dá)式與規(guī)則表達(dá)式 不匹配(想一想,它們?yōu)槭裁床黄ヅ洌?br /> 不匹配樣本表達(dá)式的字符串

ABC123456789dXYZ
ABCdefghijklmnopqrstuvwXYZ
ABcd12e1f37g3XYZ
ABC12345%67890XYZ
ABCD12E1F37G3XYZ

需要一些練習(xí)才能習(xí)慣創(chuàng)建和理解規(guī)則表達(dá)式。但是,一旦掌握了規(guī)則表達(dá)式,您就具有了強(qiáng)大的表達(dá)能力。也就是說,轉(zhuǎn)而使用規(guī)則表達(dá)式解決問題通常會(huì)很容易,而這類問題實(shí)際上可以使用更簡(jiǎn)單(而且更快速)的工具,如 string,來解決。

相關(guān)文章

  • pygame庫(kù)pgu使用示例代碼

    pygame庫(kù)pgu使用示例代碼

    pgu全稱是Phil’s pyGame Utilities,是pygame的一組模塊與腳本,其中還有g(shù)ui集成了一些小模塊,現(xiàn)在用pygame制作小游戲的人越來越多,但是pygame它是沒有彈窗機(jī)制的,今天通過本文給大家介紹pygame庫(kù)pgu使用示例代碼,需要的朋友參考下吧
    2021-08-08
  • python自動(dòng)安裝pip

    python自動(dòng)安裝pip

    這篇文章主要介紹了python自動(dòng)安裝pip的示例,需要的朋友可以參考下
    2014-04-04
  • 使用Python如何測(cè)試InnoDB與MyISAM的讀寫性能

    使用Python如何測(cè)試InnoDB與MyISAM的讀寫性能

    網(wǎng)上有很多評(píng)論myisam和innodb讀寫性能對(duì)比,所以下面這篇文章主要給大家介紹了關(guān)于使用Python如何測(cè)試InnoDB與MyISAM讀寫性能的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2018-09-09
  • 詳解Python中string模塊除去Str還剩下什么

    詳解Python中string模塊除去Str還剩下什么

    這篇文章主要介紹了詳解Python中string模塊除去Str還剩下什么,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • python3使用Pillow、tesseract-ocr與pytesseract模塊的圖片識(shí)別的方法

    python3使用Pillow、tesseract-ocr與pytesseract模塊的圖片識(shí)別的方法

    這篇文章主要介紹了python3使用Pillow、tesseract-ocr與pytesseract模塊的圖片識(shí)別的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • python實(shí)現(xiàn)簡(jiǎn)單貪吃蛇小游戲

    python實(shí)現(xiàn)簡(jiǎn)單貪吃蛇小游戲

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)單貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • python爬蟲之驗(yàn)證碼篇3-滑動(dòng)驗(yàn)證碼識(shí)別技術(shù)

    python爬蟲之驗(yàn)證碼篇3-滑動(dòng)驗(yàn)證碼識(shí)別技術(shù)

    本篇涉及到的驗(yàn)證碼為滑動(dòng)驗(yàn)證碼,不同于極驗(yàn)證,本驗(yàn)證碼難度略低,需要的將滑塊拖動(dòng)到矩形區(qū)域右側(cè)即可完成。對(duì)python爬蟲滑動(dòng)驗(yàn)證碼識(shí)別技術(shù)感興趣的朋友跟隨小編一起看看吧
    2019-04-04
  • Pandas將列表(List)轉(zhuǎn)換為數(shù)據(jù)框(Dataframe)

    Pandas將列表(List)轉(zhuǎn)換為數(shù)據(jù)框(Dataframe)

    這篇文章主要介紹了Pandas將列表(List)轉(zhuǎn)換為數(shù)據(jù)框(Dataframe),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 使用Python壓縮和解壓縮zip文件的教程

    使用Python壓縮和解壓縮zip文件的教程

    這篇文章主要介紹了使用Python壓縮和解壓縮zip文件的教程,主要用到了zipfile包,需要的朋友可以參考下
    2015-05-05
  • Python使用turtle庫(kù)繪制科赫雪花詳細(xì)代碼

    Python使用turtle庫(kù)繪制科赫雪花詳細(xì)代碼

    科赫曲線是一種分形,其形態(tài)非常像雪花,因此又被稱作科赫雪花、雪花曲線,這篇文章主要給大家介紹了關(guān)于Python使用turtle庫(kù)繪制科赫雪花的相關(guān)資料,需要的朋友可以參考下
    2024-05-05

最新評(píng)論

靖江市| 肇东市| 邹平县| 本溪市| 阳曲县| 芦溪县| 泾源县| 垣曲县| 阿鲁科尔沁旗| 灵宝市| 左贡县| 渭南市| 奉新县| 广宗县| 什邡市| 高台县| 通城县| 洪江市| 阿拉善右旗| 灵山县| 临澧县| 崇仁县| 搜索| 德格县| 贵阳市| 金门县| 梁河县| 祁连县| 筠连县| 泰宁县| 个旧市| 舒城县| 志丹县| 神池县| 都昌县| 通海县| 新邵县| 金沙县| 临城县| 新郑市| 元谋县|