日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python正则表达式re模块简明笔记

發布時間:2025/3/21 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python正则表达式re模块简明笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡介

正則表達式(regular expression)是可以匹配文本片段的模式。最簡單的正則表達式就是普通字符串,可以匹配其自身。比如,正則表達式 ‘hello’ 可以匹配字符串 ‘hello’。

要注意的是,正則表達式并不是一個程序,而是用于處理字符串的一種模式,如果你想用它來處理字符串,就必須使用支持正則表達式的工具,比如 Linux 中的 awk, sed, grep,或者編程語言 Perl, Python, Java 等等。

正則表達式有多種不同的風格,下表列出了適用于 Python 或 Perl 等編程語言的部分元字符以及說明:

re 模塊

在 Python 中,我們可以使用內置的 re 模塊來使用正則表達式。

有一點需要特別注意的是,正則表達式使用?\?對特殊字符進行轉義,比如,為了匹配字符串 ‘python.org’,我們需要使用正則表達式?'python\.org',而 Python 的字符串本身也用?\?轉義,所以上面的正則表達式在 Python 中應該寫成?'python\\.org',這會很容易陷入?\?的困擾中,因此,我們建議使用 Python 的原始字符串,只需加一個 r 前綴,上面的正則表達式可以寫成:

r'python\.org'

re 模塊提供了不少有用的函數,用以匹配字符串,比如:

  • compile 函數

  • match 函數

  • search 函數

  • findall 函數

  • finditer 函數

  • split 函數

  • sub 函數

  • subn 函數

re 模塊的一般使用步驟如下:

  • 使用 compile 函數將正則表達式的字符串形式編譯為一個 Pattern 對象

  • 通過 Pattern 對象提供的一系列方法對文本進行匹配查找,獲得匹配結果(一個 Match 對象)

  • 最后使用 Match 對象提供的屬性和方法獲得信息,根據需要進行其他的操作

compile 函數

compile 函數用于編譯正則表達式,生成一個 Pattern 對象,它的一般使用形式如下:

re.compile(pattern[, flag])

其中,pattern 是一個字符串形式的正則表達式,flag 是一個可選參數,表示匹配模式,比如忽略大小寫,多行模式等。

下面,讓我們看看例子。

import re

# 將正則表達式編譯成 Pattern 對象
pattern = re.compile(r'\d+')

在上面,我們已將一個正則表達式編譯成 Pattern 對象,接下來,我們就可以利用 pattern 的一系列方法對文本進行匹配查找了。Pattern 對象的一些常用方法主要有:

  • match 方法

  • search 方法

  • findall 方法

  • finditer 方法

  • split 方法

  • sub 方法

  • subn 方法

match 方法

match 方法用于查找字符串的頭部(也可以指定起始位置),它是一次匹配,只要找到了一個匹配的結果就返回,而不是查找所有匹配的結果。它的一般使用形式如下:

match(string[, pos[, endpos]])

其中,string 是待匹配的字符串,pos 和 endpos 是可選參數,指定字符串的起始和終點位置,默認值分別是 0 和 len (字符串長度)。因此,當你不指定 pos 和 endpos 時,match 方法默認匹配字符串的頭部

當匹配成功時,返回一個 Match 對象,如果沒有匹配上,則返回 None。

看看例子。

>>> import re
>>> pattern = re.compile(r'\d+')??????????????????? # 用于匹配至少一個數字
>>> m = pattern.match('one12twothree34four')??????? # 查找頭部,沒有匹配
>>> print m
None
>>> m = pattern.match('one12twothree34four', 2, 10) # 從'e'的位置開始匹配,沒有匹配
>>> print m
None
>>> m = pattern.match('one12twothree34four', 3, 10) # 從'1'的位置開始匹配,正好匹配
>>> print m???????????????????????????????????????? # 返回一個 Match 對象
<_sre.SRE_Match object at 0x10a42aac0>
>>> m.group(0)?? # 可省略 0
'12'
>>> m.start(0)?? # 可省略 0
3
>>> m.end(0)???? # 可省略 0
5
>>> m.span(0)??? # 可省略 0
(3, 5)

在上面,當匹配成功時返回一個 Match 對象,其中:

  • group([group1, …])?方法用于獲得一個或多個分組匹配的字符串,當要獲得整個匹配的子串時,可直接使用?group()?或?group(0);

  • start([group])?方法用于獲取分組匹配的子串在整個字符串中的起始位置(子串第一個字符的索引),參數默認值為 0;

  • end([group])?方法用于獲取分組匹配的子串在整個字符串中的結束位置(子串最后一個字符的索引+1),參數默認值為 0;

  • span([group])?方法返回?(start(group), end(group))。

再看看一個例子:

>>> import re
>>> pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I)?? # re.I 表示忽略大小寫
>>> m = pattern.match('Hello World Wide Web')
>>> print m?????????????????????????????? # 匹配成功,返回一個 Match 對象
<_sre.SRE_Match object at 0x10bea83e8>
>>> 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')
>>> m.group(3)??????????????????????????? # 不存在第三個分組
Traceback (most recent call last):
? File "<stdin>", line 1, in <module> IndexError: no such group

search 方法

search 方法用于查找字符串的任何位置,它也是一次匹配,只要找到了一個匹配的結果就返回,而不是查找所有匹配的結果,它的一般使用形式如下:

search(string[, pos[, endpos]])

其中,string 是待匹配的字符串,pos 和 endpos 是可選參數,指定字符串的起始和終點位置,默認值分別是 0 和 len (字符串長度)。

當匹配成功時,返回一個 Match 對象,如果沒有匹配上,則返回 None。

讓我們看看例子:

>>> import re
>>> pattern = re.compile('\d+')
>>> m = pattern.search('one12twothree34four')? # 這里如果使用 match 方法則不匹配
>>> m
<_sre.SRE_Match object at 0x10cc03ac0>
>>> m.group()
'12'
>>> m = pattern.search('one12twothree34four', 10, 30)? # 指定字符串區間
>>> m
<_sre.SRE_Match object at 0x10cc03b28>
>>> m.group()
'34'
>>> m.span()
(13, 15)

再來看一個例子:

# -*- coding: utf-8 -*-
import re

# 將正則表達式編譯成 Pattern 對象
pattern = re.compile(r'\d+')

# 使用 search() 查找匹配的子串,不存在匹配的子串時將返回 None
# 這里使用 match() 無法成功匹配
m = pattern.search('hello 123456 789')

if m:
??? # 使用 Match 獲得分組信息
??? print 'matching string:',m.group()
??? print 'position:',m.span()

執行結果:

matching string: 123456
position: (6, 12)

findall 方法

上面的 match 和 search 方法都是一次匹配,只要找到了一個匹配的結果就返回。然而,在大多數時候,我們需要搜索整個字符串,獲得所有匹配的結果。

findall 方法的使用形式如下:

findall(string[, pos[, endpos]])

其中,string 是待匹配的字符串,pos 和 endpos 是可選參數,指定字符串的起始和終點位置,默認值分別是 0 和 len (字符串長度)。

findall 以列表形式返回全部能匹配的子串,如果沒有匹配,則返回一個空列表。

看看例子:

import re

pattern = re.compile(r'\d+')?? # 查找數字
result1 = pattern.findall('hello 123456 789')
result2 = pattern.findall('one1two2three3four4', 0, 10)

print result1
print result2

執行結果:

['123456', '789']
['1', '2']

finditer 方法

finditer 方法的行為跟 findall 的行為類似,也是搜索整個字符串,獲得所有匹配的結果。但它返回一個順序訪問每一個匹配結果(Match 對象)的迭代器。

看看例子:

# -*- coding: utf-8 -*-

import re

pattern = re.compile(r'\d+')

result_iter1 = pattern.finditer('hello 123456 789')
result_iter2 = pattern.finditer('one1two2three3four4', 0, 10)

print type(result_iter1)
print type(result_iter2)

print 'result1...'
for m1 in result_iter1:?? # m1 是 Match 對象
??? print 'matching string: {}, position: {}'.format(m1.group(), m1.span())

print 'result2...'
for m2 in result_iter2:
??? print 'matching string: {}, position: {}'.format(m2.group(), m2.span())

執行結果:

<type 'callable-iterator'>
<type 'callable-iterator'>
result1...
matching string: 123456, position: (6, 12)
matching string: 789, position: (13, 16)
result2...
matching string: 1, position: (3, 4)
matching string: 2, position: (7, 8)

split 方法

split 方法按照能夠匹配的子串將字符串分割后返回列表,它的使用形式如下:

split(string[, maxsplit])

其中,maxsplit 用于指定最大分割次數,不指定將全部分割。

看看例子:

import re

p = re.compile(r'[\s\,\;]+')
print p.split('a,b;; c?? d')

執行結果:

['a', 'b', 'c', 'd']

sub 方法

sub 方法用于替換。它的使用形式如下:

sub(repl, string[, count])

其中,repl 可以是字符串也可以是一個函數:

  • 如果 repl 是字符串,則會使用 repl 去替換字符串每一個匹配的子串,并返回替換后的字符串,另外,repl 還可以使用?\id?的形式來引用分組,但不能使用編號 0;

  • 如果 repl 是函數,這個方法應當只接受一個參數(Match 對象),并返回一個字符串用于替換(返回的字符串中不能再引用分組)。

count 用于指定最多替換次數,不指定時全部替換。

看看例子:

import re

p = re.compile(r'(\w+) (\w+)')
s = 'hello 123, hello 456'

def func(m):
??? return 'hi' + ' ' + m.group(2)

print p.sub(r'hello world', s)? # 使用 'hello world' 替換 'hello 123' 和 'hello 456'
print p.sub(r'\2 \1', s)??????? # 引用分組
print p.sub(func, s)
print p.sub(func, s, 1)???????? # 最多替換一次

執行結果:

hello world, hello world
123 hello, 456 hello
hi 123, hi 456
hi 123, hello 456

subn 方法

subn 方法跟 sub 方法的行為類似,也用于替換。它的使用形式如下:

subn(repl, string[, count])

它返回一個元組:

(sub(repl, string[, count]), 替換次數)

元組有兩個元素,第一個元素是使用 sub 方法的結果,第二個元素返回原字符串被替換的次數。

看看例子:

import re

p = re.compile(r'(\w+) (\w+)')
s = 'hello 123, hello 456'

def func(m):
??? return 'hi' + ' ' + m.group(2)

print p.subn(r'hello world', s)
print p.subn(r'\2 \1', s)
print p.subn(func, s)
print p.subn(func, s, 1)

執行結果:

('hello world, hello world', 2)
('123 hello, 456 hello', 2)
('hi 123, hi 456', 2)
('hi 123, hello 456', 1)

其他函數

事實上,使用 compile 函數生成的 Pattern 對象的一系列方法跟 re 模塊的多數函數是對應的,但在使用上有細微差別。

match 函數

match 函數的使用形式如下:

re.match(pattern, string[, flags]):

其中,pattern 是正則表達式的字符串形式,比如?\d+,?[a-z]+。

而 Pattern 對象的 match 方法使用形式是:

match(string[, pos[, endpos]])

可以看到,match 函數不能指定字符串的區間,它只能搜索頭部,看看例子:

import re
m1 = re.match(r'\d+', 'One12twothree34four')
if m1:
??? print 'matching string:',m1.group()
else:
??? print 'm1 is:',m1

m2 = re.match(r'\d+', '12twothree34four')
if m2:
??? print 'matching string:', m2.group()
else:
??? print 'm2 is:',m2

執行結果:

m1 is: None
matching string: 12

search 函數

search 函數的使用形式如下:

re.search(pattern, string[, flags])

search 函數不能指定字符串的搜索區間,用法跟 Pattern 對象的 search 方法類似。

findall 函數

findall 函數的使用形式如下:

re.findall(pattern, string[, flags])

findall 函數不能指定字符串的搜索區間,用法跟 Pattern 對象的 findall 方法類似。

看看例子:

import re

print re.findall(r'\d+', 'hello 12345 789')

# 輸出
['12345', '789']

finditer 函數

finditer 函數的使用方法跟 Pattern 的 finditer 方法類似,形式如下:

re.finditer(pattern, string[, flags])

split 函數

split 函數的使用形式如下:

re.split(pattern, string[, maxsplit])

sub 函數

sub 函數的使用形式如下:

re.sub(pattern, repl, string[, count])

subn 函數

subn 函數的使用形式如下:

re.subn(pattern, repl, string[, count])

到底用哪種方式

從上文可以看到,使用 re 模塊有兩種方式:

  • 使用 re.compile 函數生成一個 Pattern 對象,然后使用 Pattern 對象的一系列方法對文本進行匹配查找;

  • 直接使用 re.match, re.search 和 re.findall 等函數直接對文本匹配查找;

下面,我們用一個例子展示這兩種方法。

先看第 1 種用法:

import re

# 將正則表達式先編譯成 Pattern 對象
pattern = re.compile(r'\d+')

print pattern.match('123, 123')
print pattern.search('234, 234')
print pattern.findall('345, 345')

再看第 2 種用法:

import re

print re.match(r'\d+', '123, 123')
print re.search(r'\d+', '234, 234')
print re.findall(r'\d+', '345, 345')

如果一個正則表達式需要用到多次(比如上面的?\d+),在多種場合經常需要被用到,出于效率的考慮,我們應該預先編譯該正則表達式,生成一個 Pattern 對象,再使用該對象的一系列方法對需要匹配的文件進行匹配;而如果直接使用 re.match, re.search 等函數,每次傳入一個正則表達式,它都會被編譯一次,效率就會大打折扣。

因此,我們推薦使用第 1 種用法。

匹配中文

在某些情況下,我們想匹配文本中的漢字,有一點需要注意的是,中文的 unicode 編碼范圍?主要在?[\u4e00-\u9fa5],這里說主要是因為這個范圍并不完整,比如沒有包括全角(中文)標點,不過,在大部分情況下,應該是夠用的。

假設現在想把字符串?title = u'你好,hello,世界'?中的中文提取出來,可以這么做:

# -*- coding: utf-8 -*-

import re

title = u'你好,hello,世界'
pattern = re.compile(ur'[\u4e00-\u9fa5]+')
result = pattern.findall(title)

print result

注意到,我們在正則表達式前面加上了兩個前綴?ur,其中?r?表示使用原始字符串,u?表示是 unicode 字符串。

執行結果:

[u'\u4f60\u597d', u'\u4e16\u754c']

貪婪匹配

在 Python 中,正則匹配默認是貪婪匹配(在少數語言中可能是非貪婪),也就是匹配盡可能多的字符

比如,我們想找出字符串中的所有?div?塊:

import re

content = 'aa<div>test1</div>bb<div>test2</div>cc'
pattern = re.compile(r'<div>.*</div>')
result = pattern.findall(content)

print result

執行結果:

['<div>test1</div>bb<div>test2</div>']

由于正則匹配是貪婪匹配,也就是盡可能多的匹配,因此,在成功匹配到第一個?</div>?時,它還會向右嘗試匹配,查看是否還有更長的可以成功匹配的子串。

如果我們想非貪婪匹配,可以加一個??,如下:

import re

content = 'aa<div>test1</div>bb<div>test2</div>cc'
pattern = re.compile(r'<div>.*?</div>')??? # 加上 ?
result = pattern.findall(content)

print result

結果:

['<div>test1</div>', '<div>test2</div>']

小結

re 模塊的一般使用步驟如下:

  • 使用 compile 函數將正則表達式的字符串形式編譯為一個 Pattern 對象;

  • 通過 Pattern 對象提供的一系列方法對文本進行匹配查找,獲得匹配結果(一個 Match 對象);

  • 最后使用 Match 對象提供的屬性和方法獲得信息,根據需要進行其他的操作;

Python 的正則匹配默認是貪婪匹配。


作者:FunHacks

來源:51CTO

總結

以上是生活随笔為你收集整理的Python正则表达式re模块简明笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲男人天堂电影 | 日韩综合精品 | 国产一级视频在线播放 | 亚洲视频国产精品 | 成人福利院 | 日韩欧美一区二区视频 | 干夜夜 | 国产aaaaaaa| 加勒比久久综合 | 午夜在线网站 | av资源吧首页| 人人插人人爽 | 在线免费一区 | 久久99久久99精品免观看软件 | 精品国产免费av | 亚洲午夜福利在线观看 | 蝌蚪自拍网站 | 麻豆三级 | 国产精品欧美亚洲 | 毛片毛片毛片毛片 | 高清视频免费在线观看 | 色综合天天综合网天天看片 | 粉嫩av一区二区三区 | 黄毛片在线观看 | 亚洲图片自拍偷拍区 | 欧美精品色图 | 找个毛片看看 | 国产伦精品一区二区三区免.费 | 国产肉体xxxx裸体784大胆 | 久久黄网 | 丁香花电影免费播放电影 | 国产无遮挡又黄又爽在线观看 | 涩涩国产| 国产97色在线 | 国产 | 91亚洲国产成人精品一区二三 | 激情国产精品 | 最新视频在线观看 | 在线成人免费 | 国产欧美日韩视频在线观看 | 可以免费观看的毛片 | 久久韩国 | 韩国中文字幕hd久久精品 | 国产91小视频 | 中国女人做爰视频 | 免费在线看黄视频 | 久久国产成人 | 奶波霸巨乳一二三区乳 | free性娇小hd第一次 | 打开免费观看视频在线 | 国产黄色特级片 | 欧美日韩片 | 日本一级黄色录像 | 亚洲成熟女性毛茸茸 | 国产国语亲子伦亲子 | 最全aⅴ番号库 | 成人免费一区二区三区在线观看 | 综合一区二区三区 | www.午夜视频 | 亚洲第一视频在线播放 | 日本亲近相奷中文字幕 | 久久精彩免费视频 | 手机看片91| 羞羞漫画在线 | 91视频福利 | 中文字幕在线免费视频 | 善良的少妇伦理bd中字 | 国产精品高潮呻吟视频 | 无套内谢少妇毛片 | 国产福利一区二区三区 | 欧美射射射 | 色屁屁www影院免费观看入口 | 日本肉体xxxⅹ裸体交 | 国产一线二线三线女 | 不卡中文av | wwwwxxx日本 | 五月婷婷六月丁香 | 黄色片免费 | 日本一区免费电影 | 公交顶臀绿裙妇女配视频 | 黄色资源网站 | 欧美超逼视频 | 人人妻人人澡人人爽久久av | 精品久久久无码中文字幕边打电话 | 视频一区二区三区四区五区 | 香蕉视频在线视频 | 国产成人综合视频 | 精品国产91| 好吊色视频在线观看 | 国产美女永久免费 | 欧美日韩国产精品一区二区三区 | 欧美日韩精品一区二区三区 | 欧美综合在线一区 | 四虎4hu永久免费网站影院 | 寡妇av| 亚洲一二三在线 | 精品人体无码一区二区三区 | 亚洲精品一区二区二区 | 成人在线视频网站 | 久久香蕉精品 |