python文本函數(shù) python文本分析從入門到精通

一文秒懂python正則表達式常用函數(shù)

01 Re概覽

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:主機域名、網(wǎng)頁空間、營銷軟件、網(wǎng)站建設(shè)、定襄網(wǎng)站維護、網(wǎng)站推廣。

Re模塊是python的內(nèi)置模塊,提供了正則表達式在python中的所有用法,默認安裝位置在python根目錄下的Lib文件夾(如 ..\Python\Python37\Lib)。主要提供了3大類字符串操作方法:

字符查找/匹配

字符替換

字符分割

由于是面向字符串類型的模塊,就不得不提到字符串編碼類型。re模塊中,模式串和搜索串既可以是 Unicode 字符串 (常用str類型) ,也可以是8位字節(jié)串 (bytes,2位16進制數(shù)字,例如\xe5) , 但要求二者必須是同類型字符串。

02 字符串查找/匹配

預(yù)編譯:compile

在介紹查找和匹配函數(shù)前,首先需要知道re的compile函數(shù),該函數(shù)可以將一個模式串編譯成正則表達式類型,以便后續(xù)快速匹配和復(fù)用

import?re pattern?=?re.compile(r'[a-z]{2,5}') type(pattern)?#re.Pattern

此例創(chuàng)建了一個正則表達式式對象 (re.pattern) ,命名為pattern,用于匹配2-5位小寫字母的模式串。后續(xù)在使用其他正則表達式函數(shù)時,即可使用pattern進行方法調(diào)用。

匹配:match

match函數(shù)用于從文本串的起始位置開始匹配,若匹配成功,則返回相應(yīng)的匹配對象,此時可調(diào)用group()方法返回匹配結(jié)果,也可用span()方法返回匹配起止下標區(qū)間;否則返回None

import?re pattern?=?re.compile(r'[a-z]{2,5}') text1?=?'this?is?a?re?test' res?=?pattern.match(text1) print(res)?# if?res: ?print(res.group())?#this ?print(res.span())?#(0,?4) text2?=?'是的,?this?is?a?re?test' print(pattern.match(text2))#None

match函數(shù)還有一個變形函數(shù)fullmatch,當且僅當模式串與文本串剛好全部匹配時,返回一個匹配對象,否則返回None

搜索:search

match只提供了從文本串起始位置匹配的結(jié)果,如果想從任意位置匹配,則可調(diào)用search方法,與match方法類似,當任意位置匹配成功,則立即返回一個匹配對象,也可調(diào)用span()方法獲取起止區(qū)間、調(diào)用group方法獲得匹配文本串

import?re pattern?=?re.compile(r'\s[a-z]{2}') text1?=?'this?is?a?re?test' res?=?pattern.search(text1) print(res)?# if?res: ?print(res.group())?#is ?print(res.span())?#(4,?7) pattern2?=?re.compile(r'\s[a-z]{5}') text2?=?'是的,this?is?a?re?test' print(pattern2.search(text2))#None

match和search均用于匹配單個結(jié)果,唯一區(qū)別在于前者是從起始位置開始匹配,而后者從任意位置匹配,匹配成功則返回一個match對象。

全搜索:findall/finditer

幾乎是最常用的正則表達式函數(shù),用于尋找所有匹配的結(jié)果,例如在爬蟲信息提取中,可非常方便地提取所有匹配字段

import?re pattern?=?re.compile(r'\s[a-z]{2,5}') text1?=?'this?is?a?re?test' res?=?pattern.findall(text1) print(res)?#['?is',?'?re',?'?test']

findall返回的是一個列表對象類型,當無匹配對象時,返回一個空列表。為了避免因同時返回大量匹配結(jié)果占用過多內(nèi)存,可以調(diào)用finditer函數(shù)返回一個迭代器類型,其中每個迭代元素是一個match對象,可繼續(xù)調(diào)用group和span方法獲取相應(yīng)結(jié)果

import?re pattern?=?re.compile(r'\s[a-z]{2,5}') text1?=?'this?is?a?re?test' res?=?pattern.finditer(text1) for?r?in?res: ?print(r.group()) """ ?is ?re ?test """

當匹配模式串較為簡單或者僅需單詞調(diào)用時,上述所有方法也可直接調(diào)用re類函數(shù),而無需事先編譯。此時各方法的第一個參數(shù)為模式串。

import?re pattern?=?re.compile(r'\d{2,5}') text?=?'this?is?re?test' re.findall('[a-z]+',?text)?#['this',?'is',?'re',?'test'] 03 字符串替換/分割

替換:sub/subn

當需要對文本串進行條件替換時,可調(diào)用re.sub實現(xiàn) (當然也可先編譯后再用調(diào)用實例方法) ,相應(yīng)參數(shù)分別為模式串、替換格式、文本串,還可以通過增加缺省參數(shù)限定替換次數(shù)和匹配模式。通過在模式串進行分組,可實現(xiàn)字符串的格式化替換(類似字符串的format方法),以實現(xiàn)特定任務(wù)。

import?re text?=?'today?is?2020-03-05' print(re.sub('-',?'',?text))?#'today?is?20200305' print(re.sub('-',?'',?text,?1))?#'today?is?202003-05' print(re.sub('(\d{4})-(\d{2})-(\d{2})',?r'\2/\3/\1',?text))?#'today?is?03/05/2020'

re.sub的一個變形方法是re.subn,區(qū)別是返回一個2元素的元組,其中第一個元素為替換結(jié)果,第二個為替換次數(shù)

import?re text?=?'today?is?2020-03-05' print(re.subn('-',?'',?text))?#('today?is?20200305',?2)

分割:split

還可以調(diào)用正則表達式實現(xiàn)字符串的特定分割,相當于.split()方法的一個加強版,實現(xiàn)特定模式的分割,返回一個切割后的結(jié)果列表

import?re text?=?'today?is?a?re?test,?what?do?you?mind?' print(re.split(',',?text))?#['today?is?a?re?test',?'?what?do?you?mind?'] 04 總結(jié)

python中的re模塊提供了正則表達式的常用方法,每種方法都包括類方法調(diào)用(如re.match)或模式串的實例調(diào)用(pattern.match)2種形式

常用的匹配函數(shù):match/fullmatch

常用的搜索函數(shù):search/findall/finditer

常用的替換函數(shù):sub/subn

常用的切割函數(shù):split

還有其他很多方法,但不是很常用,具體可參考官方文檔

另外,python還有第三方正則表達式庫regex可供選擇

到此這篇關(guān)于一文秒懂python正則表達式常用函數(shù)的文章就介紹到這了,希望大家以后多多支持!

python中writelines函數(shù)怎么用

writelines屬于python文件寫入操作的一個函數(shù)

文本寫入操作主要有兩個函數(shù),write(),writelines(),區(qū)別如下:

file.write(str)的參數(shù)是一個字符串,就是你要寫入文件的內(nèi)容.

file.writelines(sequence)的參數(shù)是序列,比如列表,它會迭代幫你寫入文件。

子:

#coding=utf-8

import os

import codecs

str_list = [

u'這里是第一行\(zhòng)n',

u'這里是第二行\(zhòng)n',

u'這里是第三行\(zhòng)n',

u'這里是第四行'

]

with codecs.open('test.txt','w+',encoding='utf-8') as f:

f.writelines(str_list)

python對文本文件的讀有哪些方法,寫有哪些方法?

1 文件讀取全文本操作

在一定場景下我們需要把文本全部內(nèi)容讀取出來,進行處理。python提供三種函數(shù)讀取文件,分別是read readline readlines,

read():讀取文件的全部內(nèi)容,加上參數(shù)可以指定讀取的字符。

readline():讀取文件的一行。

readlines():讀取文件的所有行到內(nèi)存中。

不同場景下我們可以選擇不同函數(shù)對文件進行讀取。

1.1 方法一

file_name = input("請輸入你要打開的文件的完整路徑及名稱")

file= open(file_name, "r")

txt=file.read()

# 全文本的處理

file.close()

使用read函數(shù)將文件中的內(nèi)容全部讀取,放在字符串變量txt中。這樣操作適合于文本較小,處理簡單的情況,當文件較大時,這種方式處理時不合適的。一次性讀取較大的文件到內(nèi)存中,會耗費較多的時間和資源。這時候分批處理效果更好。

1.2 方法二

file_name = input("請輸入你要打開的文件的完整路徑及名稱")

file= open(file_name, "r")

txt= file.read(4)

# 文本的處理while txt != ""txt= file.read(4)

# 批量文本處理

file.close()

這種方法適合于分批處理文本信息,每次批量讀入,批量處理,不會對內(nèi)存造成較大的壓力。

1.3 方法三

file_name = input("請輸入你要打開的文件的完整路徑及名稱")

file= open(file_name, "r")for line infile.readlines():

# 處理每一行數(shù)據(jù)

file.close()

這種處理方式適合處理以行為分割特點的文本,并且文本較小,因為這種處理方式需要一次性把文件所有內(nèi)容讀取到內(nèi)存中。

1.4 方法四

file_name = input("請輸入你要打開的文件的完整路徑及名稱")

file= open(file_name, "r") # 這里的file時文件句柄for line infile:

# 處理每一行數(shù)據(jù)

file.close()

這種方式和方法三中的區(qū)別是分行讀入,逐行處理,不會一次性把文件所有內(nèi)容都讀入到內(nèi)存中,對一些大文件的處理是很有效的。

2 文件寫入文本操作

文件寫入有兩種寫入函數(shù)和一種輔助支持。

write():向文件中寫入一個字符或者字節(jié)流

writelines():將一個元素全為字符串的列表寫入到文件中 需要注意的是,writelines寫入列表元素的時候會把列表元素的內(nèi)容拼接到一起寫入,不會有換行和空格 。

seek(): 輔助寫入函數(shù)offset偏移量參數(shù)代表含義如下

0 - 文件開頭

1 - 當前位置

2 - 文件結(jié)尾

2.1 方法一

file_name = input("output.txt", "w+")

text= "hello world!"file_name.write(text)

file.close()

2.2 方法二

file_name = input("output.txt", "w+")

list= ["中午","早上","晚上"]

file_name.writelines(list)for line infile:

# 讀取寫入的數(shù)據(jù),這時候發(fā)現(xiàn)是沒有任何內(nèi)容的

file.close()

我們增加一行代碼就可以讀取到寫入的文件內(nèi)容,利用seek()函數(shù)調(diào)整寫操作指針的位置,可以實現(xiàn)寫操作之后的正常讀取。

file_name = input("output.txt", "w+")

list= ["中午","早上","晚上"]

file_name.readlines(list)

file_name.seek(0) # 調(diào)整寫的指針到文件的開始位置for line infile:

# 讀取寫入的數(shù)據(jù),這時候會讀出一行寫入的數(shù)據(jù)。

file.close()

python中isread函數(shù)么

文件對象(open() 函數(shù)的返回值)提供了read()函數(shù)可以按字節(jié)或字符讀取文件內(nèi)容,到底是讀取字節(jié)還是字符,取決于使用 open() 函數(shù)打開文件時,是否使用了 b 模式,如果使用了 b 模式,則每次讀取一個字節(jié);反之,則每次讀取一個字符。

read() 函數(shù)的基本語法格式如下:

file.read([size])

其中,file 表示打開的文件對象;size 作為一個可選參數(shù),用于指定要讀取的字符個數(shù),如果省略,則默認一次性讀取所有內(nèi)容。

【例 1】采用循環(huán)讀取整個文件的內(nèi)容。

# a.txt 文件內(nèi)容為:C語言中文網(wǎng)

f = open("a.txt", 'r', True)

while True:

# 每次讀取一個字符

ch = f.read(1)

# 如果沒有讀到數(shù)據(jù),跳出循環(huán)

if not ch:

break

# 輸出ch

print(ch, end='')

f.close()

運行結(jié)果為:

C語言中文網(wǎng)

上面程序采用循環(huán)依次讀取每一個字符(因為程序沒有使用 b 模式),每讀取到一個字符,程序就輸出該字符。

正如從上面程序所看到的,當程序讀寫完文件之后,推薦立即調(diào)用 close() 方法來關(guān)閉文件,這樣可以避免資源泄露(后續(xù)章節(jié)會詳細介紹 close() 函數(shù))。

注意,在調(diào)用 read() 函數(shù)讀取文件內(nèi)容時,成功讀取的前提是在 open() 函數(shù)中使用 r 或 r+ 的模式打開文件,否則(比如將上面程序中 open()的打開模式改為 w),程序會拋出io.UnsupportedOperation異常:

Traceback (most recent call last):

File "C:\Users\mengma\Desktop\demo.py", line 4, in

ch = f.read(1)

io.UnsupportedOperation: not readable

【例 2】調(diào)用 read() 方法時不傳入?yún)?shù),該方法默認會讀取全部文件內(nèi)容。例如:

f = open("a.txt", 'r', True)

# 直接讀取全部文件

print(f.read())

f.close()

運行結(jié)果為:

C語言中文網(wǎng)

read()函數(shù)拋出UnicodeDecodeError異常的解決方法

當使用 open() 函數(shù)打開文本文件時,默認會使用當前操作系統(tǒng)的字符集,比如 Windows 平臺,open() 函數(shù)默認使用 GBK 字符集。因此,上面程序讀取的 a.txt 也必須使用 GBK 字符集保存;否則,程序就會出現(xiàn)UnicodeDecodeError錯誤。

如果要讀取的文件所使用的字符集和當前操作系統(tǒng)的字符集不匹配,則有兩種解決方式:

使用二進制模式讀取,然后用 bytes 的 decode() 方法恢復(fù)成字符串。

利用 codecs 模塊的 open() 函數(shù)來打開文件,該函數(shù)在打開文件時允許指定字符集。

例如,下面程序使用二進制模式來讀取文本文件:

# 指定使用二進制方式讀取文件內(nèi)容,a.txt 以 utf-8 編碼存儲

f = open("a.txt", 'rb', True)

# 直接讀取全部文件,并調(diào)用bytes的decode將字節(jié)內(nèi)容恢復(fù)成字符串

print(f.read().decode('utf-8'))

f.close()

上面程序在調(diào)用 open() 函數(shù)時,傳入了 rb 模式,這表明采用二進制模式讀取文件,此時文件對象的 read() 方法返回的是 bytes 對象,程序可調(diào)用 bytes 對象的 decode() 方法將它恢復(fù)成字符串。由于此時讀取的 a.txt 文件是以 UTF-8 的格式保存的,因此程序需要使用 decode() 方法恢復(fù)字符串時顯式指定使用 UTF-8 字符集。

下面程序使用 codes 模塊的 open() 函數(shù)來打開文件,此時可以顯式指定字符集:

import codecs

# 指定使用utf-8 字符集讀取文件內(nèi)容

f = codecs.open("a.txt", 'r', 'utf-8', buffering=True)

while True:

# 每次讀取一個字符

ch = f.read(1)

# 如果沒有讀取到數(shù)據(jù),則跳出循環(huán)

if not ch : break

# 輸出ch

print (ch, end='')

f.close()

上面程序在調(diào)用 open() 函數(shù)時顯式指定使用 UTF-8 字符集,這樣程序在讀取文件內(nèi)容時就完全沒有問題了。

網(wǎng)頁標題:python文本函數(shù) python文本分析從入門到精通
網(wǎng)站路徑:http://muchs.cn/article36/doedspg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護、電子商務(wù)、響應(yīng)式網(wǎng)站定制網(wǎng)站、微信小程序、網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)