1. 程式人生 > >re正則表示式

re正則表示式

字元

功能說明

\number

代表除了換行字元以外的所有字元。

\d

代表字串位於開頭。

\D

代表字串位於結尾。

\s

代表空格字元,即r'[ \t\n\r\f\v]'

\S

代表非空格字元,即r'[^ \t\n\r\f\v]'

\w

代表英數字,即[0-9a-zA-Z]

\W

代表\w定義以外的所有字元。

reg中的sub比較高階,可以傳方法,實際上經過1,外部的pattern match; 2, 傳入方法; 3, 方法內部的操作; 4, 方法用return返回;這幾步。

經典的sub方法最後都是default傳回m.group(0).

其實sub方法變來變去還挺有意思。

pattern = re.compile(**);

首先把input按照pattern處理成多個group,

line = pattern.sub(...(func), line)

有func的話,然後再把處理完成後的匹配的字串傳入func,然後將return值作為最終的替換值。

search

group: group(0)表示整個字串,group(1)表示第一個匹配的字串, print時要Print result.group(),因為result是一個類,或者group().title,就是列印內容。

group(0).title,表示列印group(0)中的內容。這個group後面括號裡面的數就是正則裡面第幾個括號。

m in finditer 

os.access(FILENAME, os.F_OK)

除了pipe外,還有執行命令的方法。

        cmd = 'arm-eabi-addr2line -f -C -e %s %s' % (absPath,adr)
        print("decoding address <0x%s> at file '%s'" % (adr, absPath))
        
        try:
            # decoded = check_output(cmd.split(), stderr=STDOUT)
            decoded = execute_sys_cmd(cmd

raise Exception("Invalid rule file format"

getopt.GetoptError

print "Error:", sys.exc_info()[1]

print('[ERR] %s \n' % (str(sys.exc_info()[0])))

可以pattern = re.compile, line2 = pattern.match(line), 然後line2.group(0)....來表示

 轉:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html

另有:http://wiki.ubuntu.org.cn/Python%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97

本文介紹了Python對於正則表示式的支援,包括正則表示式基礎以及Python正則表示式標準庫的完整介紹及使用示例。本文的內容不包括如何編寫高效的正則表示式、如何優化正則表示式,這些主題請檢視其他教程。

注意:本文基於Python2.4完成;如果看到不明白的詞彙請記得百度谷歌或維基,whatever。

尊重作者的勞動,轉載請註明作者及原文地址 >.<html

1. 正則表示式基礎

1.1. 簡單介紹

正則表示式並不是Python的一部分。正則表示式是用於處理字串的強大工具,擁有自己獨特的語法以及一個獨立的處理引擎,效率上可能不如str自帶的方法,但功能十分強大。得益於這一點,在提供了正則表示式的語言裡,正則表示式的語法都是一樣的,區別只在於不同的程式語言實現支援的語法數量不同;但不用擔心,不被支援的語法通常是不常用的部分。如果已經在其他語言裡使用過正則表示式,只需要簡單看一看就可以上手了。

下圖展示了使用正則表示式進行匹配的流程: 
re_simple

正則表示式的大致匹配過程是:依次拿出表示式和文字中的字元比較,如果每一個字元都能匹配,則匹配成功;一旦有匹配不成功的字元則匹配失敗。如果表示式中有量詞或邊界,這個過程會稍微有一些不同,但也是很好理解的,看下圖中的示例以及自己多使用幾次就能明白。

下圖列出了Python支援的正則表示式元字元和語法:   
pyre

1.2. 數量詞的貪婪模式與非貪婪模式

正則表示式通常用於在文字中查詢匹配的字串。Python裡數量詞預設是貪婪的(在少數語言裡也可能是預設非貪婪),總是嘗試匹配儘可能多的字元;非貪婪的則相反,總是嘗試匹配儘可能少的字元。例如:正則表示式"ab*"如果用於查詢"abbbc",將找到"abbb"。而如果使用非貪婪的數量詞"ab*?",將找到"a"。

1.3. 反斜槓的困擾

與大多數程式語言相同,正則表示式裡使用"\"作為轉義字元,這就可能造成反斜槓困擾。假如你需要匹配文字中的字元"\",那麼使用程式語言表示的正則表示式裡將需要4個反斜槓"\\\\":前兩個和後兩個分別用於在程式語言裡轉義成反斜槓,轉換成兩個反斜槓後再在正則表示式裡轉義成一個反斜槓。Python裡的原生字串很好地解決了這個問題,這個例子中的正則表示式可以使用r"\\"表示。同樣,匹配一個數字的"\\d"可以寫成r"\d"。有了原生字串,你再也不用擔心是不是漏寫了反斜槓,寫出來的表示式也更直觀。

1.4. 匹配模式

正則表示式提供了一些可用的匹配模式,比如忽略大小寫、多行匹配等,這部分內容將在Pattern類的工廠方法re.compile(pattern[, flags])中一起介紹。

2. re模組

2.1. 開始使用re

Python通過re模組提供對正則表示式的支援。使用re的一般步驟是先將正則表示式的字串形式編譯為Pattern例項,然後使用Pattern例項處理文字並獲得匹配結果(一個Match例項),最後使用Match例項獲得資訊,進行其他的操作。

01 # encoding: UTF-8
02 import re
03
04 # 將正則表示式編譯成Pattern物件
05 pattern =re.compile(r'hello')
06
07 # 使用Pattern匹配文字,獲得匹配結果,無法匹配時將返回None
08 match =pattern.match('hello world!')
09
10 if match:
11 # 使用Match獲得分組資訊
12 printmatch.group()
13
14 ### 輸出 ###
15 # hello

re.compile(strPattern[, flag]):

這個方法是Pattern類的工廠方法,用於將字串形式的正則表示式編譯為Pattern物件。 第二個引數flag是匹配模式,取值可以使用按位或運算子'|'表示同時生效,比如re.I | re.M。另外,你也可以在regex字串中指定模式,比如re.compile('pattern', re.I | re.M)與re.compile('(?im)pattern')是等價的。
可選值有:

  • re.I(re.IGNORECASE): 忽略大小寫(括號內是完整寫法,下同)
  • M(MULTILINE): 多行模式,改變'^'和'$'的行為(參見上圖)
  • S(DOTALL): 點任意匹配模式,改變'.'的行為
  • L(LOCALE): 使預定字元類 \w \W \b \B \s \S 取決於當前區域設定
  • U(UNICODE): 使預定字元類 \w \W \b \B \s \S \d \D 取決於unicode定義的字元屬性
  • X(VERBOSE): 詳細模式。這個模式下正則表示式可以是多行,忽略空白字元,並可以加入註釋。以下兩個正則表示式是等價的:
1 = re.compile(r"""\d +  # the integral part
2 \.    # the decimal point
3 \d *  # some fractional digits""", re.X)
4 = re.compile(r"\d+\.\d*")

re提供了眾多模組方法用於完成正則表示式的功能。這些方法可以使用Pattern例項的相應方法替代,唯一的好處是少寫一行re.compile()程式碼,但同時也無法複用編譯後的Pattern物件。這些方法將在Pattern類的例項方法部分一起介紹。如上面這個例子可以簡寫為:

1 = re.match(r'hello''hello world!')
2 print m.group()

re模組還提供了一個方法escape(string),用於將string中的正則表示式元字元如*/+/?等之前加上轉義符再返回,在需要大量匹配元字元時有那麼一點用。

2.2. Match

Match物件是一次匹配的結果,包含了很多關於此次匹配的資訊,可以使用Match提供的可讀屬性或方法來獲取這些資訊。

屬性:

  1. string: 匹配時使用的文字。
  2. re: 匹配時使用的Pattern物件。
  3. pos: 文字中正則表示式開始搜尋的索引。值與Pattern.match()和Pattern.seach()方法的同名引數相同。
  4. endpos: 文字中正則表示式結束搜尋的索引。值與Pattern.match()和Pattern.seach()方法的同名引數相同。
  5. lastindex: 最後一個被捕獲的分組在文字中的索引。如果沒有被捕獲的分組,將為None。
  6. lastgroup: 最後一個被捕獲的分組的別名。如果這個分組沒有別名或者沒有被捕獲的分組,將為None。

方法:

  1. group([group1, …]): 
    獲得一個或多個分組截獲的字串;指定多個引數時將以元組形式返回。group1可以使用編號也可以使用別名;編號0代表整個匹配的子串;不填寫引數時,返回group(0);沒有截獲字串的組返回None;截獲了多次的組返回最後一次截獲的子串。
  2. groups([default]): 
    以元組形式返回全部分組截獲的字串。相當於呼叫group(1,2,…last)。default表示沒有截獲字串的組以這個值替代,預設為None。
  3. groupdict([default]): 
    返回以有別名的組的別名為鍵、以該組截獲的子串為值的字典,沒有別名的組不包含在內。default含義同上。
  4. start([group]): 
    返回指定的組截獲的子串在string中的起始索引(子串第一個字元的索引)。group預設值為0。
  5. end([group]): 
    返回指定的組截獲的子串在string中的結束索引(子串最後一個字元的索引+1)。group預設值為0。
  6. span([group]): 
    返回(start(group), end(group))。
  7. expand(template): 
    將匹配到的分組代入template中然後返回。template中可以使用\id或\g<id>、\g<name>引用分組,但不能使用編號0。\id與\g<id>是等價的;但\10將被認為是第10個分組,如果你想表達\1之後是字元'0',只能使用\g<1>0。
01 import re
02 = re.match(r'(\w+) (\w+)(?P<sign>.*)','hello world!')
03
04 print "m.string:", m.string
05 print "m.re:", m.re
06 print "m.pos:", m.pos
07 print "m.endpos:", m.endpos
08 print "m.lastindex:", m.lastindex
09 print "m.lastgroup:", m.lastgroup
10
11 print "m.group(1,2):", m.group(1,2)
12 print "m.groups():", m.groups()
13 print "m.groupdict():", m.groupdict()
14 print "m.start(2):", m.start(2)
15 print "m.end(2):", m.end(2)
16 print "m.span(2):", m.span(2)
17 print r"m.expand(r'\2 \1\3'):", m.expand(r'\2 \1\3')
18
19 ### output ###
20 # m.string: hello world!
21 # m.re: <_sre.SRE_Pattern object at 0x016E1A38>
22 # m.pos: 0
23 # m.endpos: 12
24 # m.lastindex: 3
25 # m.lastgroup: sign
26 # m.group(1,2): ('hello', 'world')
27 # m.groups(): ('hello', 'world', '!')
28 # m.groupdict(): {'sign': '!'}
29 # m.start(2): 6
30 # m.end(2): 11
31 # m.span(2): (6, 11)
32 # m.expand(r'\2 \1\3'): world hello!

2.3. Pattern

Pattern物件是一個編譯好的正則表示式,通過Pattern提供的一系列方法可以對文字進行匹配查詢。

Pattern不能直接例項化,必須使用re.compile()進行構造。

Pattern提供了幾個可讀屬性用於獲取表示式的相關資訊:

  1. pattern: 編譯時用的表示式字串。
  2. flags: 編譯時用的匹配模式。數字形式。
  3. groups: 表示式中分組的數量。
  4. groupindex: 以表示式中有別名的組的別名為鍵、以該組對應的編號為值的字典,沒有別名的組不包含在內。
01 import re
02 = re.compile(r'(\w+) (\w+)(?P<sign>.*)', re.DOTALL)
03
04 print "p.pattern:", p.pattern
05 print "p.flags:", p.flags
06 print "p.groups:", p.groups
07 print "p.groupindex:", p.groupindex
08
09 ### output ###
10 # p.pattern: (\w+) (\w+)(?P<sign>.*)
11 # p.flags: 16
12 # p.groups: 3
13 # p.groupindex: {'sign': 3}

例項方法[ | re模組方法]:

  1. match(string[, pos[, endpos]]) | re.match(pattern, string[, flags]): 
    這個方法將從string的pos下標處起嘗試匹配pattern;如果pattern結束時仍可匹配,則返回一個Match物件;如果匹配過程中pattern無法匹配,或者匹配未結束就已到達endpos,則返回None。
    pos和endpos的預設值分別為0和len(string);re.match()無法指定這兩個引數,引數flags用於編譯pattern時指定匹配模式。 
    注意:這個方法並不是完全匹配。當pattern結束時若string還有剩餘字元,仍然視為成功。想要完全匹配,可以在表示式末尾加上邊界匹配符'$'。 
    示例參見2.1小節。
  2. search(string[, pos[, endpos]]) | re.search(pattern, string[, flags]):
    這個方法用於查詢字串中可以匹配成功的子串。從string的pos下標處起嘗試匹配pattern,如果pattern結束時仍可匹配,則返回一個Match物件;若無法匹配,則將pos加1後重新嘗試匹配;直到pos=endpos時仍無法匹配則返回None。
    pos和endpos的預設值分別為0和len(string));re.search()無法指定這兩個引數,引數flags用於編譯pattern時指定匹配模式。 
    01 # encoding: UTF-8
    02 import re
    03
    04 # 將正則表示式編譯成Pattern物件
    05 pattern =re.compile(r'world')
    06
    07 # 使用search()查詢匹配的子串,不存在能匹配的子串時將返回None
    08 # 這個例子中使用match()無法成功匹配
    09 match =pattern.search('hello world!')
    10
    11 if match:
    12 # 使用Match獲得分組資訊
    13 printmatch.group()
    14
    15 ### 輸出 ###
    16 # world
  3. split(string[, maxsplit]) | re.split(pattern, string[, maxsplit]): 
    按照能夠匹配的子串將string分割後返回列表。maxsplit用於指定最大分割次數,不指定將全部分割。 
    1 import re
    2
    3 = re.compile(r'\d+')
    4 print p.split('one1two2three3four4')
    5
    6 ### output ###
    7 # ['one', 'two', 'three', 'four', '']
  4. findall(string[, pos[, endpos]]) | re.findall(pattern, string[, flags]):
    搜尋string,以列表形式返回全部能匹配的子串。 
    1 import re
    2
    3 = re.compile(r'\d+')
    4 print p.findall('one1two2three3four4')
    5
    6 ### output ###
    7 # ['1', '2', '3', '4']
  5. finditer(string[, pos[, endpos]]) | re.finditer(pattern, string[, flags]):
    搜尋string,返回一個順序訪問每一個匹配結果(Match物件)的迭代器。 
    1 import re
    2
    3 = re.compile(r'\d+')
    4 for in p.finditer('one1two2three3four4'):
    5 printm.group(),
    6
    7 ### output ###
    8 # 1 2 3 4
  6. sub(repl, string[, count]) | re.sub(pattern, repl, string[, count]): 
    使用repl替換string中每一個匹配的子串後返回替換後的字串。 
    當repl是一個字串時,可以使用\id或\g<id>、\g<name>引用分組,但不能使用編號0。 
    當repl是一個方法時,這個方法應當只接受一個引數(Match物件),並返回一個字串用於替換(返回的字串中不能再引用分組)。 
    count用於指定最多替換次數,不指定時全部替換。 
    01 import re
    02
    03 = re.compile(r'(\w+) (\w+)')
    04 = 'i say, hello world!'
    05
    06 print p.sub(r'\2 \1', s)
    07
    08 def func(m):
    09 returnm.group(1).title()+' '+m.group(2).title()
    10
    11 print p.sub(func, s)
    12
    13 ### output ###
    14 # say i, world hello!
    15 # I Say, Hello World!
  7. subn(repl, string[, count]) |re.sub(pattern, repl, string[, count]): 
    返回 (sub(repl, string[, count]), 替換次數)。 
    01 import re
    02
    03 = re.compile(r'(\w+) (\w+)')
    04 = 'i say, hello world!'
    05
    06 print p.subn(r'\2 \1', s)
    07
    08 def func(m):
    09 returnm.group(1).title()+' '+m.group(2).title()
    10
    11 print p.subn(func, s)
    12
    13 ### output ###
    14 # ('say i, world hello!', 2)
    15 # ('I Say, Hello World!', 2)

以上就是Python對於正則表示式的支援。熟練掌握正則表示式是每一個程式設計師必須具備的技能,這年頭沒有不與字串打交道的程式了。筆者也處於初級階段,與君共勉,^_^

相關推薦

RE表示式總結(一)

一、概念         正則表示式,又稱規則表示式。(英語:Regular Expression,在程式碼中常簡寫為regex、regexp或RE),電腦科學的一個概念。正則表示式是對字元串(包括普通字元(例如,a 到 z 之間的字母)和特殊字元(稱為“

logging日誌模組,re表示式模組,hashlib hash演算法相關的庫,

logging: 功能完善的日誌模組 import logging #日誌的級別 logging.debug("這是個除錯資訊")#級別10 #常規資訊 logging.info("常規資訊")#20 #警告資訊 logging.warning("警告

python學習 re表示式

一、正則的常用符號: .     匹配任一字元,換行符\n除外 *     匹配前一個字元0次或無限次 ?     匹配前一個字元0次或1次 .*     貪心演算法(儘可能多的匹配) .*? &nb

python模組-re表示式

元字元  .   *   +   ?   ^   $   { }     [ ]     -  &n

python html抓取,並用re表示式解析(一)

html抓取,並用re進行解析 #coding=utf-8 import urllib.request import re ''' url :"http://money.163.com/special/pinglun/" 抓取第一頁的新聞資訊,並按照以下規格輸出。 [ {'ti

python html抓取,並用re表示式解析(二)

需求: url: “http://search.jd.com/Search?keyword=幼貓貓糧&enc=utf-8#filter” 給出一個jd_search(keyword)方法,keyword為你要查詢的東西,比如:貓糧、手機,替換上面url中的keyword,得到一個新網

Python庫-re(表示式)

re庫是python的一個標準庫,不需要自己用pip額外下載,直接呼叫即可。 下面介紹以下庫中函式的作用。 1.re.compile(patter, flags=0) patter是一個正則表示式字串,例如"[0-9]+",該函式返回一個模式物件(patter object),str型別 2

python RE表示式基本知識

1.  Python正則式的基本用法 1.1基本規則 1.2重複 1.2.1最小匹配與精確匹配 1.3前向界定與後向界定 1.4組的基本知識 2.  re模組的基本函式 2.1使用compile加速 2.2 match和sear

python26 re表示式

  #coding:utf-8 #/usr/bin/python """ 2018-11-25 dinghanhua re """ import re teststr = '"id":"2994925","publisher":"Yahoo Press","isbn10":"05965177

Python 常用模組之re 表示式的使用

re模組用來使用正則表示式。正則表示式用來對字串進行搜尋的工作。我們最應該掌握正則表示式的查詢,更改,刪除的功能。特別是做爬蟲的時候,re模組就顯得格外重要。 1.查詢 1 import re 2 a = re.match("abc","aabccc") 3 b = re.search("abc",

re表示式模組

import re print(re.match('^chenrong','chenronghua123'))  # ^ 表示開頭 #<_sre.SRE_Match object; span=(0, 8), match='chenrong'> # span=(匹配到的結果第幾位開始,

Python中re(表示式)常用函式總結

1  re.match       #嘗試從字串的開始匹配一個模式     re.match的函式原型為:re.match(pattern, string, flags)     第一個引數是正則表示式,這裡為"(\w+)\s",如果匹配成功,則返回一個Match,否則返

python 66:re表示式8(全- tcy)

目錄: 1.re-概述 https://mp.csdn.net/postedit/851568392.re-函式 https://mp.csdn.net/postedit/851569933.re-Pattern   https://mp.csdn.net/postedit/85157

python----使用re表示式刷選資料,去重,列表,取特定行資料(適用於web的html回包資料提取)

python—-使用re正則表示式刷選資料,去重,列表,取特定行資料(適用於web的html回包資料提取) 環境配置:對目標伺服器的日誌檔案進行刷選特定資料(192.168.4.27) /usr/

模組3 re + 表示式

1. 正則表示式 匹配字串 元字元 . 除了換行 \w 數字, 字母, 下劃線 \d 數字 \s 空白符 \n \t \b 單詞的邊界 \W 非xxx \D

python-re表示式

正則表示式 # 一個線上正則表示式工具 http://tool.oschina.net/regex/ 模式 描述 \w 匹配字母數字及下劃線 \W

python re 表示式

  正則表示式是用於字串搜尋、匹配、替換的常見方法,而它實際上就是一個特殊的字元序列,用來幫助你方便的檢查一個字串是否與某種模式匹配。 Python中re包是專門用來處理正則表示式的相關操作,我參考了一些資料整理了re包中所有的函式應用,僅供參考!  說明

re表示式

字元 功能說明 \number 代表除了換行字元以外的所有字元。 \d 代表字串位於開頭。 \D 代表字串位於結尾。 \s 代表空格字元,即r'[ \t\n\r\f\v]'。 \S 代表非空格字元,即r'

python re表示式說明文件

這個文件是一個關於用Python中的re模組來使用正則表示式的教程。 1、序言 re 模組在Python1.5中被加入,並且提供了Perl型別的正則表示式模式。較早的Python版本用的是regex模組,它提供Emacs型別模式。 Emacs型別模式可讀性差

Python3 re(表示式)

#coding=utf-8 # regular.py 正則表示式 import re # 正則模組 def regular(): data = "She is more than pretty. 520" # --- 正則 ---