欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在Python中使用正則表達式的方法

 更新時間:2015年08月13日 08:57:27   作者:木頭lbj  
這篇文章主要介紹了在Python中使用正則表達式的方法,講到了專門對正則表達式提供支持的擴展庫re,需要的朋友可以參考下

正則表達式(regular expression)是一種用形式化語法描述的文本匹配模式。在需要處理大量文本處理的應用中有廣泛的使用,我沒使用的編輯器,IDE中的搜索常用正則表達式作為搜索模式。玩過*nix系統(tǒng)的都知道如sed,grep,awk這類的命令,他們是非常強大的文本處理工具。幾乎所有的語言都有對正則表達式的支持,有的直接在語法中支持,有的使用擴展庫的形式。python使用的就是擴展庫re。

    re.search(pattern,string,flag=0)

    搜索文本中的匹配的模式是最常用的.以模式和文本作為輸入,如果有匹配則返回一個Match對象,反之返回None。
    每個Match對象包括相關的匹配信息:原字符串、正則表達式和匹配的文本在字符串中的位置。
import re 
pattern = "this" 
text = "Does this text match the pattern?" 
match = re.search(pattern, text) # 返回一個Match對象 
print match.re.pattern # 要匹配的正則表達式"this"
print match.string   # 匹配的文本"Does this match the pattern?" 
print match.start()   # 匹配的開始位置 5
print match.end()    # 匹配的結束位置 9

    re.compile(pattern,flag=0)
    如果程序中頻繁的使用到同一個正則表達式,每次使用的時候都寫一遍正則表達式不僅不高效而且會大大增加出錯的幾率,re提供了compile函數將一個表達式字符串編譯為一個RegexObject。
    模塊級函數會維護已編譯表達式的一個緩存,而這個緩存是的大小是有限制的。直接使用已經編譯的表達式可以避免緩存查找的開銷,并且在加載模塊時就會預編譯所有的表達式。

import re 
regex = re.compile("this") 
text = "Does this text match the pattern?" 
match = regex.search(text) 
if match: 
  print "match" 
  match.group(0)  #返回匹配的字符串  
else:
  print "not match" 

    re.findall(pattern, string, flag=0)
    使用search會返回匹配的單個實例,使用findall會返回所有匹配的不重疊的子串。

import re 
pattern = 'ab' 
text = 'abbaaabbbbaaaaaa' 
re.findall(pattern, text)  # 返回['ab', 'ab'] 

    re.finditer(pattern, string, flag=0)
    finditer會返回一個迭代器,會生成Match實例,不像findall()返回字符串.

import re 
pattern = 'ab' 
text = 'abbaaabbbbaaaaaa' 
match = re.finditer(pattern, text)  
for m in match:
  print m.start() 
  print m.end()

以上的例子會分別輸出兩次匹配結果的起始位置和結束位置。

正則匹配默認采用的是貪婪算法,也就是說會re在匹配的時候會利用盡可能多的輸入,而使用?可以關閉這種貪心行為,只匹配最少的輸入。這之前先說下量詞。

量詞是為了簡化正則表達式的讀寫而定義的,通用的形式是{m,n},這表示匹配的個數至少是m,最多是n,在','之后不能有空格,否則會出錯,并且均為閉區(qū)間。

  •     {n} 之前的元素必須出現n次
  •     {m,n} 之前元素最少出現m次,最多n次
  •     {m,} 之前的元素最少出現m次,無上限
  •     {0,n} 之前的元素可以不出現,也可以出現,出現的話最多出現n次

除了之上,還有三個常用的量詞*,?和+

  •     * 等價于{0,}
  •     + 等價于{1,}
  •     \? 等價于{0,1}

還有^和$,分別表示段或者字符串的開始與結束。

import re 
re.search("^travell?er$", "traveler")  # True 
re.search("^travell?er$", "traveller")  # True  
re.search("^ab\*", "abbbbbbb")      # True,返回"abbbbbbb" 
re.search("^ab\*?", "abbbbbbb")     # True,返回"a" 
re.search("^ab+", "abbbbbbb")      # True,返回"abbbbbbb" 
re.search("^ab+?", "abbbbbbb")      # True,返回"ab" 

對于一些預定義的字符集可以使用轉義碼可以更加緊湊的表示,re可以識別的轉義碼有3對,6個,分別為三個字母的大小寫,他們的意義是相反的。

  •     \d : 一個數字
  •     \D : 一個非數字
  •     \w : 字母或者數字
  •     \W : 非字母,非數字
  •     \s : 空白符(制表符,空格,換行符等)
  •     \S : 非空白符

如果想指定匹配的內容在文本的相對位置,可以使用錨定,跟轉義碼類似。

  •     ^ 字符或行的開始
  •     $ 字符或行的結束
  •     \A 字符串的開始
  •     \Z 字符串結束
  •     \b 一個單詞開頭或者末尾的空串
  •     \B 不在一個單詞開頭或末尾的空串
import re
the_str = "This is some text -- with punctuation" 
re.search(r'^\w+', the_str).group(0)    # This
re.search(r'\A\w+', the_str).group(0)   # This 
re.search(r'\w+\S*$', the_str).group(0)  # punctuation 
re.search(r'\w+\S*\Z', the_str).group(0)  # punctuation 
re.search(r'\w*t\W*', the_str).group(0)  # text -- 
re.search(r'\bt\w+', the_str).group(0)   # text 
re.search(r'\Bt*\B', the_str).group(0)   # 沒有匹配 

用組來解析匹配,簡單的說就是在一個正則表達式中有幾個小括號()將匹配的表達式分成不同的組,使用group()函數來獲取某個組的匹配,其中0為整個正則表達式所匹配的內容,后面從1開始從左往右依次獲取每個組的匹配,即每個小括號中的匹配。使用groups()可以獲取所有的匹配內容。

import re 
the_str = "--aabb123bbaa" 
pattern = r'(\W+)([a-z]+)(\d+)(\D+)' 
match = re.search(pattern, the_str)  
match.groups()  # ('--', 'aabb', '123', 'bbaa') 
match.group(0)  # '--aabb123bbaa' 
match.group(1)  # '--' 
match.group(2)  # 'aabb' 
match.group(3)  # '123' 
match.group(4)  # 'bbaa'

python對分組的語法做了擴展,我們可以對每個分組進行命名,這樣便可以使用名稱來調用。語法:(?P<name>pattern),使用groupdict()可以返回一個包含了組名的字典。

import re 
the_str = "--aabb123bbaa" 
pattern = r'(?P<not_al_and_num>\W+)(?P<al>[a-z]+)(?P<num>\d+)(?P<not_num>\D+)' 
match = re.search(pattern, the_str)  
match.groups()  # ('--', 'aabb', '123', 'bbaa') 
match.groupdict() # {'not_al_and_num': '--', 'not_num': 'bbaa', 'num': '123', 'al': 'aabb'} 
match.group(0)          # '--aabb123bbaa' 
match.group(1)          # '--' 
match.group(2)          # 'aabb' 
match.group(3)          # '123' 
match.group(4)          # 'bbaa'  
match.group('not_al_and_num')  # '--'
match.group('al')         # 'aabb' 
match.group('num')        # '123' '
match.group('not_num')      # 'bbaa'

以上的group()方法在使用的時候需要注意,只有在有匹配的時候才會正常運行,否則會拋錯,所以在不能保證有匹配而又要輸出匹配結果的時候,必須做校驗。

在re中可以設置不通的標志,也就是search()和compile()等中都包含的缺省變量flag。使用標志可以進行完成一些特殊的要求,如忽略大小寫,多行搜索等。

import re 
the_str = "this Text" 
re.findall(r'\bt\w+', the_str)  # ['this'] 
re.findall(r'\bt\w+', the_str, re.IGNORECASE) # ['this', 'Text'] 

 

相關文章

  • PyTorch一小時掌握之autograd機制篇

    PyTorch一小時掌握之autograd機制篇

    這篇文章主要介紹了PyTorch一小時掌握之autograd機制篇,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • Python Pygame實戰(zhàn)之趣味籃球游戲的實現

    Python Pygame實戰(zhàn)之趣味籃球游戲的實現

    這篇文章主要為大家分享了一個基于Python和Pygame實現的一個趣味籃球游戲,文中的示例代碼講解詳細,對我們學習Python有一定幫助,需要的可以參考一下
    2022-04-04
  • Python的Flask框架中實現登錄用戶的個人資料和頭像的教程

    Python的Flask框架中實現登錄用戶的個人資料和頭像的教程

    這篇文章主要介紹了Python的Flask框架中實現登錄用戶的個人資料和頭像的教程,這也是各個web框架的最基本功能之一,需要的朋友可以參考下
    2015-04-04
  • Python庫textract提取各種文檔類型中文本數據

    Python庫textract提取各種文檔類型中文本數據

    Python的textract庫是一個強大的工具,它可以從各種文檔類型中提取文本數據,無論是PDF、Word文檔、圖片還是其他格式的文件,textract都可以輕松地將文本提取出來,本文將詳細介紹textract的功能和用法,并提供豐富的示例代碼來幫助大家深入了解
    2024-01-01
  • 云原生Docker部署Django和mysql項目全過程

    云原生Docker部署Django和mysql項目全過程

    最近在學習用docker部署Django項目,經過百折不撓的鼓搗,終于將項目部署成功,下面這篇文章主要給大家介紹了關于云原生Docker部署Django和mysql項目的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-12-12
  • 零基礎寫python爬蟲之爬蟲的定義及URL構成

    零基礎寫python爬蟲之爬蟲的定義及URL構成

    俗話說工欲善其事必先利其器,作為本系列文章的第一篇,我們同樣也需要先利其器,先把爬蟲的定義以及寫爬蟲所需要的基礎知識先介紹給大家。
    2014-11-11
  • python人人網登錄應用實例

    python人人網登錄應用實例

    這篇文章主要介紹了python人人網登錄應用實例,是一個非常實用的技巧,需要的朋友可以參考下
    2014-09-09
  • 深入淺析Python中l(wèi)ist的復制及深拷貝與淺拷貝

    深入淺析Python中l(wèi)ist的復制及深拷貝與淺拷貝

    這篇文章主要介紹了Python中l(wèi)ist的復制及深拷貝與淺拷貝及區(qū)別解析 ,需要的朋友可以參考下
    2018-09-09
  • python處理寫入數據代碼講解

    python處理寫入數據代碼講解

    在本篇文章里小編給大家整理的是一篇關于python處理寫入數據代碼講解內容,有興趣的朋友們可以學習下。
    2020-10-10
  • Python使用jpype模塊調用jar包過程解析

    Python使用jpype模塊調用jar包過程解析

    這篇文章主要介紹了Python使用jpype模塊調用jar包過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07

最新評論