正則表達式應用

  1. 正則表達式基礎

  正則表達式(RE)爲高級文本模式匹配,以及搜索-替代等功能提供了基礎。它使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在不少文本編輯器裏,正則表達式一般被用來檢索、替換那些符合某個模式的文本。python

  正則表達式能夠用來:正則表達式

(1)驗證字符串是否符合指定特徵,好比驗證是不是合法的郵件地址。編輯器

(2)用來查找字符串,從一個長的文本中查找符合指定特徵的字符串,比查找固定字符串更加靈活方便。函數

(3)用來替換,比普通的替換更強大。spa

  下面的圖很到地展現了使用正則表達式進行匹配的流程:code

  在Python經過標準的re模塊支持正則表達式。其主要有兩種匹配模式:搜索(searching)和匹配(matching)。搜索是指在字符串中搜索匹配的模式,而匹配則是判斷一個字符可否從起始處所有或部分的匹配某個模式。它們分別經過search()和match()函數實現。正則表達式中用元字符——特殊字符和符號,來經過正則表達式引擎匹配字符。對象

下圖是python中支持的正則表達式元字符和語法(圖片引自:http://www.cnblogs.com/huxi):blog

   

  

 2. python中的正則表達式 

  python中正則表達re模塊的經常使用函數及方法:
圖片

   (1)match() 與search()的區別。ip

  match()函數嘗試從字符串的開頭開始對模式進行匹配。匹配對象的group()方法能夠用來顯示那個成功的匹配。  

>>> m = re.match('foo','food is power')  # 匹配成功
>>> m # 匹配對象的實例
<_sre.SRE_Match at 0x1f77ac0>
>>> m.group() # 注意:若是上面的匹配失敗,此處將會出現AttributeError異常。
'foo' # 由於匹配失敗m將被賦值None,而它是沒有group()屬性(方法)的。

   search()函數在一個字符串中查找一個模式。它會檢查參數字符串任意位置的地方給定正則表達式模式的匹配狀況。

>>> m = re.search('foo','seafood')  # 匹配成功

  (2)匹配多個字符串(|)

  使用管道符進行多個字符匹配:

>>> bt = 'bat | bet | bit'
>>> m = re.match(bt,'bit') # ‘bit’匹配成功
>>> n = re.search(bt,'he bit me!') # 搜索到‘bit’

  (3)匹配任單個字符(.)

 >>> any = '.end'  
  >>> m = re.match(any, 'xend')  # 句點匹配‘x’
  >>> m
  <_sre.SRE_Match object at 0xd81098>
  >>> m.group()
  'xend'
  >>> n = re.search(any, 'The end.') # 匹配‘ ’
  >>> n.group()
  ' end'

 # 使用反斜線對匹配對象進行轉義,使句點失去它的特殊意思:

 >>> pi = '3.14'   # 句點匹配任意一個字符

 >>> pi_2 = '3\.14'  #反斜線轉義

 >>> m = re.match(pi_2, '3.1415')
  >>> m.group()
  '3.14'
  >>> m = re.match(pi, '3914')
  >>> m.group()
  '3914'

   (4)建立字符集合([ ])

  字符集合的形式就是在進行正則匹配時,只匹配集合符([ ])裏面的任意一個字符。它與管道符(例如「s2d | s5n」)是不一樣的。下面是使用舉例:

>>> m = re.match('[ce][16][qw]','e6q') # 匹配‘e6q’
>>> m.group()
'e6q'

   (5)訪問分組(group( ))

  python中使用group()方法訪問每一個子組以及用groups()方法獲取一個包含全部匹配子組的元組。

>>> m = re.match('(\w\w\w)-(\d\d\d)','abc-123')
>>> m.group() # 匹配全部部分
'abc-123'
>>> m.group(1) # 匹配子組1
'abc'
>>> m.group(2) # 匹配子組2
'123'
>>> m.groups() # 匹配全部子組
('abc','123')
# # # # # # #
>>> n = re.match('(a(b))','ab')
>>> n.group()
'ab'
>>> n.group(1)
'ab'
>>> n.group(2)
'b'
>>> n.groups()
('ab','b')

  (6)使用findall()找到全部匹配成功的部分

  findall()會不重疊地搜索字符串中一個正則表達式的出現狀況,返回全部匹配的列表。

>>> re.findall('car\w','carry the barcardi to the car!')
['carr','card']

  (7)使用sub()和subn()進行搜索和替換

  sub()函數原型:sub(pattern,repl,string,max=0) 若是max的值沒有給出,則對全部匹配的地方進行替換。subn()函數與sub()函數差很少,但subn()函數會返回一個包含替換次數的元組。

>>> re.sub('ID','linger','welcome to ID \'s blog!')
"welcome to linger's blog!"
>>> re.subn('ID','linger','welcome to ID\'s blog!')
("welcome to Linger's blog!", 1)

  (8)使用split()分割

  re模塊中的split() 與字符串中的split()方法類似,前者是根據正則表達式模式分隔字符串,後者是根據固定的字符串分割。因此,因爲正則表達式的靈活性,其分割能力顯著提高。當設定max的值後還能夠指定分割的最大次數。

>>> re.split(':','str1:str2:str3')['str1','str2','str3']# 示例: Linux下使用正則處理who命令輸出#!/usr/bin/env pythonimport os,ref = os.popen('who')for eachLine in f.readLines():  print re.split('\s\s+|\t',eachLine.strip())f.close()
相關文章
相關標籤/搜索