歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Python 正則表達式基礎

Python 正則表達式基礎

日期:2017/3/1 9:17:07   编辑:Linux編程

正則表達式對於初學者來說,要用好這個功能還是有點難度,也看了好久書加練習才掌握一些基礎。對學到的一些東西還是寫下來比較好一些,免得過幾天又忘了。

常用符號:. * ? ()

常用方法: findall search sub

常用技巧

1 Python 正則式的基本用法

  Python 通過標准庫re模塊支持正則表達式。

>>> import re

>>> string = "XXXIXXXLoveXXX"

>>> re.findall('XXX(.*?)XXX', string)

['I']

>>>

在python術語中,有兩種主要方法完成模式匹配:serarching 和matching.


搜索:在字符串中任意部分中搜索匹配模式。

匹配:判斷一個字符串是否能從起始位置全部或部分匹配某個模式。

常用正則符號字符如下圖:

a. 基本規則

'.' 匹配所有字符

匹配除換行符 '\n' 外的所有字符。如果使用了 'S' 選項,匹配包括 '\n' 的所有字符。要明確的匹配一個'.',必須使用’\‘對它進行轉義。

>>> s = """XXX
IXXX"""
>>> re.findall('.+', s)
['XXX', 'IXXX']
>>> re.findall('.+', s, re.S)
['XXX\nIXXX']
>>>

b. 對基本規則作限定(閉包操作符)

'*' 0 或多次匹配。常用.*(貪心算法)

>>> x = "abc2323sf23"

>>> re.findall('c.*s', x)

['c2323s']

>>>


'+' 1 次或多次匹配

>>> x = "abc2323sf23"

>>> re.findall('c\d+s', x)

['c2323s']

>>>


'?' 0 或 1 次匹配。常用.*?(非談心算法)

>>> x = "abc2323sf23"

>>> re.findall('c\d?', x)

['c2']

>>> re.findall('c\d+?', x)

['c2']

>>> re.findall('c.*?', x)

['c']


‘{m}'精確匹配 m 次

‘{m,n}'匹配最少 m 次,最多 n 次

2. ()創建組

一對()和正則表達式一起使用可達到:

  a. 對正則進行分組

  b. 匹配子組

>>> s= 'XXXIXXXLOVEXXXYOU'

>>> re.findall('XXX(.*)XXX(.*)XXX(.*)', s)

[('I', 'LOVE', 'YOU')]

>>>

可以看到 findall 函數只返回了包含在 ’()’ 中的內容,而雖然前面和後面的內容都匹配成功了,卻並不包含在結果中。

3. 常用函數

findall(pattern, string[,flags])

在目標字符串中查找符合規則的字符串。

第一個參數是規則,第二個參數是目標字符串,後面還可以跟一個規則選項。

返回結果結果是一個列表, 中間存放的是符合規則的字符串。如果沒有符合規則的字符串被找到,就返回一個空列表。

常用規則選項

I IGNORECASE 忽略大小寫區別。

L LOCAL 字符集本地化。這個功能是為了支持多語言版本的字符集使用環境的,比如在轉義符/w ,在英文環境下,它代表[a-zA-Z0-9] ,即所以英文字符和數字。如果在一個法語環境下使用,缺省設置下,不能匹配 "é" 或 "ç" 。 加上這 L 選項和就可以匹配了。不過這個對於中文環境似乎沒有什麼用,它仍然不能匹配中文字符。

M MULTILINE 多行匹配。在這個模式下 ’^’( 代表字符串開頭 ) 和 ’$’( 代表字符串結尾 ) 將能夠匹配多行的情況,成為行首和行尾標記。

當我們調用findall()方法,我們可以非常簡單的得到一個所有匹配模式的 列表,而不是得到對象。

>>> string = 'bird cat bird, cat dog'
>>> s = re.findall(r'cat', string)
>>> s
['cat', 'cat']
>>>

match 與 search

match( pattern, string, flags = 0)

search( pattern, string, flags = 0)

match函數嘗試從字符串的開頭開始對模式進行匹配,如果匹配成功,就返回一個匹配對象,如果失敗返回空,匹配對象的group()方法可以用來顯示那個成功的匹配。

search函數工作方式和match一樣,這兩個函數唯一的區別是: match 從字符串的開頭開始匹配,如果開頭位置沒有匹配成功,就算失敗了;而 search 會跳過開頭,繼續向後尋找是否有匹配的字符串。

常見例子:

對字符串'bird cat bird'調用mathch()方法,查找模式'bird'將會匹配:

>>> re.match(r'bird', 'cat bird cat')
>>> string = 'bird cat bird'
>>> s = re.match(r'bird', string)
>>> s
<_sre.SRE_Match object at 0x0000000003104D30>
>>> s.group()
'bird'
>>> s = re.match(r'cat', string)
>>> s
>>>

但是,如果我們對同一個字符串調用math()方法,查找模式'cat',則不會找到匹配。

而search()結果則不一樣,search()方法會在它查找到一個匹配項之後停止繼續查找,並返回其首次出現的位置。

>>> string = 'bird cat bird'
>>> s = re.search(r'cat', string)
>>> s
<_sre.SRE_Match object at 0x0000000003104D30>
>>> s.group()
'cat'
>>>

分組示例:

即:上面提到的'()'號,對整個正則表達式的特定子串進行定位的能力。我們可以定義一個分組做為整個正則表達式的一部分,然後單獨的對這部分對應匹配到的內容定位。

>>> string = "name: Tom, phone: 12344"
>>> s = re.findall(r'(.*): (.*), phone: (\d+)',string)
>>> s
[('name', 'Tom', '12344')]
>>> s = re.search(r'(.*): (.*), phone: (\d+)',string)
>>> s
<_sre.SRE_Match object at 0x0000000002F54AE0>
>>> s.group(1)
'name'
>>> s.group(2)
'Tom'
>>> s.group(3)
'12344'
>>>

通過用圓括號來(字符‘(’和‘)’)包圍正則表達式的特定部分,可以對內容進行分組然後對這些子組做單獨處理。

下面關於Python的文章您也可能喜歡,不妨看看:

CentOS 7安裝Python3.5 http://www.linuxidc.com/Linux/2016-04/129784.htm

Linux下Python的安裝以及注意事項 http://www.linuxidc.com/Linux/2015-11/124861.htm

Ubuntu 14.04 下安裝使用Python rq模塊 http://www.linuxidc.com/Linux/2015-08/122441.htm

無需操作系統直接運行 Python 代碼 http://www.linuxidc.com/Linux/2015-05/117357.htm

CentOS上源碼安裝Python3.4 http://www.linuxidc.com/Linux/2015-01/111870.htm

《Python核心編程 第二版》.(Wesley J. Chun ).[高清PDF中文版] http://www.linuxidc.com/Linux/2013-06/85425.htm

《Python開發技術詳解》.( 周偉,宗傑).[高清PDF掃描版+隨書視頻+代碼] http://www.linuxidc.com/Linux/2013-11/92693.htm

Python腳本獲取Linux系統信息 http://www.linuxidc.com/Linux/2013-08/88531.htm

在Ubuntu下用Python搭建桌面算法交易研究環境 http://www.linuxidc.com/Linux/2013-11/92534.htm

Python 語言的發展簡史 http://www.linuxidc.com/Linux/2014-09/107206.htm

Python 的詳細介紹:請點這裡
Python 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved