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

python re 正則表示式

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

說明:以下所有函式均是(均可)re.funcname(),也就是說正則表示式具有兩種程式設計手法,使用方式基本相同,但是函式引數略有不同,使用時注意就好!

  • 方法1

    ​ re.function();

  • 方法2

    ​ obj = re.compile();

    ​ obj.funcname();

compile()

  compile()函式根據一個模式字串和可選的標誌引數生成一個正則表示式物件

。該物件擁有一系列方法用於正則表示式匹配和替換,所謂一系列方法即是包括下面要介紹的所有函式,而下面所有函式又可以通過re.funcname()呼叫,這一點要非常注意!

re.compile(pattern='regex_exp', flags=re.I)

  • pattern : 一個字串形式的正則表示式
  • flags : 可選,表示匹配模式,比如忽略大小寫,多行模式等,具體引數為:
    1. re.I 忽略大小寫
    2. re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依賴於當前環境
    3. re.M 多行模式
    4. re.S 即為 . 並且包括換行符在內的任意字元(. 不包括換行符)
    5. re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依賴於 Unicode 字元屬性資料庫
    6. re.X 為了增加可讀性,忽略空格和 # 後面的註釋
# match()函式嘗試從字串的起始位置匹配一個模式,如果不是起始位置匹配成功的話,match()就返回none

>>>import re


# 例項1
>>> pattern = re.compile(r'\d+')                    # 用於匹配至少一個數字
>>> m = pattern.match('one12twothree34four')        # 查詢頭部,沒有匹配
>>> print m
None

>>> 
m = pattern.match('one12twothree34four', 3, 10) # 從'1'的位置開始匹配,正好匹配 >>> print m # 返回一個 Match 物件 <_sre.SRE_Match object at 0x10a42aac0> # 用於獲得一個或多個分組匹配的字串,當要獲得整個匹配的子串時,可直接使用 group() 或 group(0) >>> m.group(0) # 可省略 0 '12' # 用於獲取分組匹配的子串在整個字串中的起始位置(子串第一個字元的索引),引數預設值為 0 >>> m.start(0) # 可省略 0 3 # 用於獲取分組匹配的子串在整個字串中的結束位置(子串最後一個字元的索引+1),引數預設值為 0 >>> m.end(0) # 可省略 0 5 # (start(group), end(group)) >>> m.span(0) # 可省略 0 (3, 5) # 例項2 # 該例子中正式引入分組概念,注意理解 >>> pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I) >>> m = pattern.match('Hello World Wide Web') >>> m.group(0) # 返回匹配成功的整個子串 'Hello World' >>> m.span(0) # 返回匹配成功的整個子串的索引 (0, 11) >>> m.group(1) # 返回第一個分組匹配成功的子串 'Hello' >>> m.span(1) # 返回第一個分組匹配成功的子串的索引 (0, 5) >>> m.group(2) # 返回第二個分組匹配成功的子串 'World' >>> m.span(2) # 返回第二個分組匹配成功的子串 (6, 11) >>> m.groups() # 等價於 (m.group(1), m.group(2), ...) ('Hello', 'World')

match()

  如前所述,re.match()嘗試從字串的起始位置匹配一個模式,如果匹配成功則返回一個Match物件,反之返回none

import re
print(re.match('www', 'www.runoob.com').span())  # 在起始位置匹配  (0,3)
print(re.match('com', 'www.runoob.com'))         # 不在起始位置匹配 None

fullmatch()

  這個好理解,要求完全匹配

import re

s = '234d'
matched = re.fullmatch('\d+', s, 0)
if matched:
    print(matched.group())
else:
    print('not matched')

 # not matched

search()

  re.search 掃描整個字串並返回第一個成功的匹配(Match物件),否則返回None

line = "Cats are smarter than dogs"
searchObj = re.search(r'(.*) are (.*?) .*', line, re.M | re.I)
# print(type(searchObj))  # Match物件
if searchObj:
    # 這是第二個提到分組的例子
    # 分組是對匹配結果的一個分組,體現在正則表示式的()上,一個()代表建立一個分組
    print("searchObj.group() : ", searchObj.group())
    print("searchObj.group(1) : ", searchObj.group(1))
    print("searchObj.group(2) : ", searchObj.group(2))
else:
    print("Nothing found!!")


# searchObj.group() :  Cats are smarter than dogs
# searchObj.group(1) :  Cats
# searchObj.group(2) :  smarter

sub()

  sub()函式用於字串替換,原型:re.sub(pattern, repl, string, count=0, flags=0),說明一下,count是指模式匹配後替換的最大次數,預設 0 表示替換所有的匹配;repl(replace)表示替換的字串,也可為一個函式。

# repl 作為一個字串
import re

num = "2018-08-17"
new_num = re.sub(r"\D", "", num, count=0)
print(new_num)

# 20180817
# repl作為一個函式 

# 將匹配的數字乘以 2
def double(matched):
    value = int(matched.group('value'))
    return str(value * 2)

s = 'A23G4HFD567'
new_str = re.sub(r'(?P<value>\d+)', double, s)
print(new_str)
# A46G8HFD1134

subn

subn()函式基本同sub()函式,唯一不同點是subn()還會返回替代次數,例子如下:

s = 'A23G4HFD567'
n = re.subn(r'(?P<value>\d+)', '', s)
print(n)

# ('AGHFD', 3) 返回一個tuple。根據具體情境選用sub() or subn()

findall()

  在字串中找到正則表示式所匹配的所有子串,並返回一個列表,如果沒有找到匹配的,則返回空列表,而上面提到的match()、search()函式匹配一次且返回物件為Match或None.

s = 'A23G4HFD567'
# flags其實和上面一樣,不過這裡我用的是 int型別數來表示
# 具體對應關係,我...也記不住!
print(re.findall(r'\d+', s, flags=0))

# ['23', '4', '567']

finditer()

  和 findall 類似,在字串中找到正則表示式所匹配的所有子串,並把它們作為一個迭代器返回,具有更好的效能。

s = 'A23G4HFD567'
iter = re.finditer(r'\d+', s, flags=0)

for match in iter:
    print(match.group())

# 23
# 4
# 567

split()

  split 方法按照能夠匹配的子串將字串分割後返回列表,在很多其他語言也有這個函式,如C#,java。在函式中,maxsplit表示分隔次數,maxsplit=1 分隔一次,預設為 0,不限制次數。

import re
s = 'A23G4HFD567N'
res = re.split(r'\d+', s, maxsplit=2, flags=0)
print(res)

# ['A', 'G', 'HFD567N']

escape()

  可以對字串中所有可能被解釋為正則運算子的字元進行轉義的應用函式。如果字串很長且包含很多特殊技字元,而你又不想輸入一大堆反斜槓,例子:

s = 'A23G4HFD567N'

# Escape all the characters in pattern except ASCII letters, numbers and '_'.
# re.escape('www.python.org')  # 返回值 str

res = re.findall(re.escape('*+.py'), "jw.pyji w.py.f")
print(res)

# ['w.py', 'w.py']

purge()

  無參函式,用於清空快取中的正則表示式,用於末尾,就好比其他語言中的close()、flush(),用來做相應的收尾工作。

Match Object

  Match物件在前面的例子中已經有例子了,提出來主要是為了更全面、更清晰。re.match()和re.search()函式如果匹配成功都會返回一個match物件,這裡主要看看Match物件的一些方法應用。

import re

s = '234d567gg'
matched = re.search(r'(\d+)\w(\d+)', s, flags=0)

if matched:
    print(matched.groups())  # ('234', '567')

    print(matched.group())  # 234d567
    print(matched.group(1))  # 234
    print(matched.group(2))  # 567

    print(matched.span())  # (0,7)
    print(matched.start(0))  # 0
    print(matched.end(0))  # 7

    print(matched.expand(r'\2 \1'))  # 567 234 type is str
    # 注意這下面的用法 python3.6及以上才有的
    print(matched[0])  # 234d567
    print(matched[1])  # 234
    print(matched[2])  # 567

    # 屬性
    print(matched.pos)  # 0
    print(matched.endpos)  # 7
    print(matched.string)  # 234d567
    print(matched.re)  # 返回的是regular expression object
    print(matched.lastindex)  # 2,這個2指的是 matched[i]
    print(matched.lastgroup)  # None

相關推薦

python RE表示式基本知識

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

python-re表示式

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

python re 表示式

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

python re表示式說明文件

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

Python Re表示式

正則表示式是用來簡潔表達一組字串的表示式 正則表示式在文字處理中十分常用: 表達文字型別的特徵(病毒、入侵等) 同時查詢或替換一組字串 匹配字串的全部或部分……最主要應用在字串匹配中 編譯:將符合正則

python學習-表示式re模塊

我只 com 返回 現在 輸出 -1 完全匹配 group clu python中的所有正則表達式函數都在re模塊中。import re導入該模塊。 1,創建正則表達式對象 想re.compile()傳入一個字符串值,表示正則表達式,它將返回一個Regex模式對象。 創建一

Python表示式re.match的用法

re.match(pattern, string, flags) 第一個引數是正則表示式,如果匹配成功,則返回一個Match,否則返回一個None; 第二個引數表示要匹配的字串; 第三個引數是標緻位,用於控制正則表示式的匹配方式,如:是否區分大小寫,多行匹配等等。 需要特別注意的是,這個方法並不是完

【轉】Python表示式re模組)

【轉】Python之正則表示式(re模組) 本節內容 re模組介紹 使用re模組的步驟 re模組簡單應用示例 關於匹配物件的說明 說說正則表示式字串前的r字首 re模組綜合應用例項 參考文件 提示: 由於該站對MARKDOWN的表格支援的不是很好,所以本文中的表

[Python模組]表示式 re模組的使用與例項

很喜歡Python教材中的這句格言: 有些人面臨問題時會想:“我知道, 我將使用正則表示式來解決這個問題.” 這讓他們面臨的問題變成了兩個. ---------Jamie Zawinski 正則表示式的確好用,但是複雜的模式難以閱讀和維護,與其把花在研究用正則表示式處理複雜的問題上,

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 表示式的使用

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

python表示式re模組

一.正則表示式中常用的字元含義 1、普通字元和11個元字元: 常用字元劃分 匹配範圍 示例資料 匹配的正則表示式 目標匹配的字串 普通字元 匹配自身 abc

Pythonre(表示式)常用函式總結

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

[Python模組]表示式 re模組的使用及例項

很喜歡Python教材中的這句格言: 有些人面臨問題時會想:“我知道, 我將使用正則表示式來解決這個問題.” 這讓他們面臨的問題變成了兩個. ---------Jamie Zawinski 正則表示式的確好用,但是複雜的模式難以閱讀和維護,與其把花在研究用正

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模板

一,什麼是re Python 的 re 模組(Regular Expression 正則表示式)提供各種正則表示式的匹配操作,使用這一內嵌於 Python 的語言工具,儘管不能滿足所有複雜的匹配情況,但足夠在絕大多數情況下能夠有效地實現對複雜字串的分析