歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋果6袋
6
麥子學(xué)院

python字符串搜索與匹配

發(fā)布時(shí)間:2017-09-19 23:29  回復(fù):0  查看:2839   最后回復(fù):2017-09-19 23:29  

本文和大家分享的主要是python中字符串搜索與匹配相關(guān)內(nèi)容,一起來看看吧,希望對(duì)大家學(xué)習(xí)python 有所幫助。

  字符串是python中常見的一種對(duì)象,使用的方法也很簡單,只需要用引號(hào)引起來就可以看做是一個(gè)字符串。

  字符串的搜索和匹配在編程中很容易見到,這里我就簡單的總結(jié)一下:

  1. 字符串自帶方法匹配開頭和結(jié)尾str.startswith(string)str.endswith(string)或切片

  在startend后面都有個(gè)s,這個(gè)很容易拼寫錯(cuò)誤。這兩個(gè)函數(shù)返回值是布爾值,也就是TrueFalse,用來判斷字符串是否是以某某開頭或結(jié)尾

>>> filenames = 'files.txt'

>>> filenames.startswith('file')

True

>>> filenames.endswith('.txt')

True

>>> filenames.endswith('.exe')

  False

  這兩個(gè)方法還可以傳入一個(gè)元組類型的參數(shù)

  >>> filenames.endswith(('.txt','.exe','.bat'))

  True

  當(dāng)然上述方法,用切片也很容易做到

>>> filenames[:4] == 'file'

True

>>> filenames[-4:] == '.txt'

True

>>> filenames[-4:] == '.txt' or filenames[-3:] == 'exe'

True

  2. 使用shell通配符匹配字符串

  shell通配符

  * 匹配所有

  ? 匹配單個(gè)字符[seq] 匹配任意在seq中的字符[!seq] 匹配任意不在seq中的字符

  需要使用到fnmatch模塊,該模塊提供三個(gè)方法來匹配字符串,fnmatch、fnmatchcase、filter

>>> fnmatch('file.txt','*.txt')

True

>>> fnmatch('file.txt','?ile.txt')

True

>>> fnmatch('file0.txt','file[0-9]*')

True

>>> [name for name in names if fnmatch(name,'file*.txt')]

['file1.txt', 'file2.txt']

>>> filter(names,'file*.txt')

  ['file1.txt', 'file2.txt']

  fnmatchfnmatchcase的區(qū)別就在于,fnmatch使用操作系統(tǒng)底層的大小寫敏感原則,也就是說像windows系統(tǒng),對(duì)大小寫不明感的系統(tǒng),匹配'txt''TXT'會(huì)得到同樣的效果。而fnmatchcase則是對(duì)大小寫敏感的。

  filter方法和[n for n in names if fnmatch(n, pattern)]一樣的效果,在編寫程序的時(shí)候,使用filter可能更簡潔,更有效。

  3. 匹配或搜索指定文本

  ·如果你想匹配的是字面字符串,直接用find函數(shù)即可

  find函數(shù)會(huì)返回找到的第一個(gè)字符串的索引,如果沒有找到會(huì)返回-1

>>> findstr = 'welcom python'

>>> findstr.find('py')

7

>>> findstr.find('to')

-1

>>> findstr.rfind('o')

11

  find函數(shù)可以從指定區(qū)間進(jìn)行查找,也可以從字符串尾部進(jìn)行查找rfind。

  ·如果想匹配更復(fù)雜的字符串,就需要用到正則表達(dá)式了。

  需要使用到re模塊

>>> import re>>> date = '25/8/2017'

>>> m = re.match(r'\d+/\d+/\d+',date)

>>> if m:

...    print(m.group())

...

25/8/2017

  re.match只能從字符串的第一個(gè)字符進(jìn)行查找,如果失敗就返回None。

  如果需要從任意位置去匹配,則需要用到findall或者search

>>> today = 'today is 25/8/2017 and yesterday is 24/8/2017'

>>> datepat = re.compile(r'\d+/\d+/\d+')

>>> datepat.findall(today)

  ['25/8/2017', '24/8/2017']

  這里用到了re.compile(),其實(shí)下面這兩種情況是等同的:

  # 使用compileprog = re.compile(pattern)result = prog.match(string)# 直接使用matchresult = re.match(pattern, string)

  使用search的話只會(huì)匹配第一個(gè)查找的內(nèi)容:

>>> m = re.search(r'\d+/\d+/\d+',today)

>>> if m :m.group()

'25/8/2017'

  還有一個(gè)finditer則返回一個(gè)迭代器:

>>> for m in re.finditer(r'\d+/\d+/\d+',today):

...    print(m.group())

...

25/8/2017

24/8/2017

  如果需要做大量的匹配或操作的話,最好使用re.compile()編譯正則表達(dá)式,然后進(jìn)行匹配或搜索。

  當(dāng)然正則表達(dá)式還有很多其他的用法和特性,這里暫時(shí)就不敘述了。

 

 

來源:簡書

您還未登錄,請(qǐng)先登錄

熱門帖子

最新帖子

?