如下:
麻栗坡網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,麻栗坡網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為麻栗坡近千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營銷網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的麻栗坡做網(wǎng)站的公司定做!
1、index函數(shù):用于從列表中找出某個值第一個匹配項(xiàng)的索引位置。
2、index方法語法:list.index(x[,?start[,?end]])。
3、參數(shù):x-- 查找的對象。start-- 可選,查找的起始位置。end-- 可選,查找的結(jié)束位置。
4、返回值:該方法返回查找對象的索引位置,如果沒有找到對象則拋出異常。
5、實(shí)例:
代碼:str1?=?"this?is?string?example....wow!!!";str2?=?"exam"。
index函數(shù)為print(str1.index(str2))。
python中index函數(shù)怎么用?
Python中index方法檢測字符串中是否包含子字符串 str ,如果指定 beg(開始) 和 end(結(jié)束) 范圍,則檢查是否包含在指定范圍內(nèi),該方法與 python find方法一樣,只不過如果str不在string中會報一個異常。
index函數(shù)一般用處是在序列中檢索參數(shù)并返回第一次出現(xiàn)的索引,沒找到就會報錯。
一. 簡介
正則表達(dá)式又叫規(guī)則表達(dá)式,是處理字符串的強(qiáng)大工具。在python中通過調(diào)用re模塊,可以實(shí)現(xiàn)正則匹配,正則表達(dá)式模式被編譯成一系列的字節(jié)碼,然后由C編寫的匹配引擎執(zhí)行
二. python常用字符含義(匹配模式)
1186367-20180604115644788-1913251705.png
三. re模塊
1. re.match(pattern, string, flags=0) | match(string, [pos, endpos]) (這個用于編譯后返回的正則表達(dá)式對象Pattern.match())
1)作用:嘗試從字符串的起始位置匹配一個模式,如果起始位置匹配成功,返回一個match對象,否則返回None
pattern:匹配的正則表達(dá)式
string:要匹配的字符串
flags:標(biāo)志位,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫,多行匹配等
2) 正則表達(dá)式可以包含一些可選標(biāo)志修飾符來控制匹配模式。修飾符被指定為一個可選的標(biāo)志,多個修飾符可以通過 | 來指定,如re.I | re.M表示對大小寫不敏感和多行匹配
1186367-20180604123302464-360465156.png
3) 實(shí)例
importreprint(re.match('www', '').span()) #在起始位置匹配
print(re.match('com', '')) #不在起始位置匹配
運(yùn)行結(jié)果為:
(0, 3)
None
為什么第一個起始位置匹配要加span()?
span()的作用是:返回一個元組包含匹配 (開始,結(jié)束) 的位置,如果不加span(),我們獲得的只是一個match obj,只有加了span(),我們才能獲得匹配對象的位置。不信請看:
#在命令行輸出
print(re.match('www', ''))_sre.SRE_Match object; span=(0, 3), match='www'
print(re.match('com', ''))
None
為什么第二個非起始位置匹配不加span()?
不在起始位置匹配,默認(rèn)返回的None,而None對象是沒有span()方法的,這時候就會報錯:
importreprint(re.match('com', '').span())
Traceback (most recent call last):
File"", line 1, in
print(re.match('com', '').span())
AttributeError: 'NoneType' object has no attribute 'span'
2. re.search(pattern, string, flags=0) | search(string, [pos, endpos])(這個用于編譯后返回的正則表達(dá)式對象Pattern.search())
1) 作用:在字符串內(nèi)查找匹配模式,只要找到第一個匹配則返回一個match對象,如果沒有找到,則返回None
importre#不加span()返回一個match對象
print(re.search('www', ''))_sre.SRE_Match object; span=(0, 3), match='www'
print(re.search('www', '').span())
(0,3)print(re.search('com', '').span())
(11, 14)
3. re.match和re.search一旦匹配成功,就會返回一個match object對象,而match object對象有以下方法:
group(num) num代表組號,表示匹配第num組的字符串,不寫時默認(rèn)是0,表示匹配整個表達(dá)式的字符串。group()也可以一次輸入多個組號,如group(1, 2, 3),這種情況下它將返回一個包含那些組所對應(yīng)的元組
groups() 返回一個包含所有小組字符串的元組,從1到所含的小組號
span() 返回一個元組包含匹配(開始、結(jié)束)的位置
start() 返回匹配開始的位置
end() 返回匹配結(jié)束的位置
1) 實(shí)例
importre
line= "Cats are smarter than dogs"searchObj= re.search( r'(.*) are (.*?) .*', line, re.M|re.I)print(searchObj.group())
Cats are smarter than dogsprint(searchObj.group(0))
Cats are smarter than dogsprint(searchObj.group(1))
Catsprint(searchObj.group(2))
smarterprint(searchObj.group(1, 2))
('Cats', 'smarter')
print(searchObj.groups())
('Cats', 'smarter')
為什么第二組匹配是 (.*?) 而不是 (.*)
我們做個試驗(yàn),嘗試一下 (.*)
importre
line= "Cats are smarter than dogs"searchObj= re.search( r'(.*) are (.*) .*', line, re.M|re.I)print(searchObj.group())
Cats are smarter than dogsprint(searchObj.group(1))
Catsprint(searchObj.group(2))
smarter thanprint(searchObj.group(1, 2))
('Cats', 'smarter than')
注意到group(2)的數(shù)據(jù)是不同的,這個是為什么呢?這就涉及到貪婪匹配和非貪婪匹配
貪婪匹配: 在整個表達(dá)式匹配成功的情況下,盡可能多的匹配。比如上面的 .*
.表示除換行之外的所有字符, *表示匹配前面的字符0次或無數(shù)次
非貪婪匹配:在整個表達(dá)式匹配成功的情況下,盡可能少的匹配。比圖上面的 .*?
?表示匹配前面字符0次或1次
注意前面 are () .* 中,()前后是兩個空格,而are之后兩個空格之間有兩種情況,1. "smarter than", 2. "smarter",具體選擇哪種是由匹配模式?jīng)Q定的,當(dāng)()里是貪婪匹配時,.*可以匹配smarter,可以匹配空格,可以匹配than,當(dāng)()里是非貪婪模式時, .*?只會匹配smarter,因?yàn)樗疃嗥ヅ湟淮?/p>
為什么要用前綴 r 呢?
我們知道在python中, \ 表示轉(zhuǎn)義字符,如果需要匹配一個 \ 本身呢?我們就要用\\, 而分別對每個 \ 進(jìn)行轉(zhuǎn)義,就需要用 \\\\
注意:如果字符串中有字符*需要匹配,可以使用\*或字符集[*]
4. re.compile(pattern, [flags])
1) 作用:用于編譯正則表達(dá)式,生成一個正則表達(dá)式對象(Pattern,這個Pattern不能直接實(shí)例化,必須由re.compile()進(jìn)行構(gòu)造),供match()和search()這兩個函數(shù)使用
pattern:一個字符串形式的正則表達(dá)式
flags:編譯標(biāo)志位,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫、多行匹配等
2) 實(shí)例1
importre#用于匹配至少一個數(shù)字
pattern = re.compile(r'\d+')#從開始位置匹配
m = pattern.match('one12twothree34four')#沒有匹配,返回None
print(m)
None#從"1"的位置開始匹配
m = pattern.match('one12twothree34four', 3, 10)#正好匹配返回一個match對象
print(m)_sre.SRE_Match object; span=(3, 5), match='12'
print(m.group())12
print(m.start())3
print(m.end())5
print(m.span())
(3, 5)
實(shí)例2
importre#re.I表示忽略大小寫
pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I)
m= pattern.match('Hello World Wide Web')#匹配成功返回一個match對象
print(m)_sre.SRE_Match object; span=(0, 11), match='Hello World'
#返回匹配成功的整個子串
print(m.group(0))
Hello World#返回匹配成功的整個子串的索引
print(m.span(0))
(0,11)#返回第一個分組匹配成功的子串
print(m.group(1))
Hello#返回第一個分組匹配成功的子串的索引
print(m.span(1))
(0,5)#返回第二個分組匹配成功的子串
print(m.group(2))
World#返回第二個分組匹配成功的子串的索引
print(m.span(2))
(6, 11)#等價于(m.group(1), m.group(2), ...)
print(m.groups())
('Hello', 'World')#不存在第三個分組
print(m.group(3))
Traceback (most recent call last):
File"", line 1, in
print(m.group(3))
IndexError: no such group
5. re.findall(pattern, string, flags=0) | findall(string, [pos, endpos])
1) 作用:遍歷匹配,以列表形式返回所有能匹配的子串,如果沒找到匹配的,則返回空列表
string:待匹配的字符串
pos:可選參數(shù),指定字符串的起始位置,默認(rèn)為0
endpos:可選參數(shù),指定字符串的結(jié)束位置,默認(rèn)為字符串的長度
2) 實(shí)例
importre#查找數(shù)字
pattern = re.compile(r'\d+')
result1= pattern.findall('runoob 123 google 456')print(result1)
['123', '456']
result2= pattern.findall('run88oob123google456', 0, 10)print(result2)
['88', '12']
6. re.finditer(pattern, string, flags=0) | finditer(string, [pos, endpos])
1) 作用:搜索string,返回一個順序訪問每一個匹配結(jié)果(match對象)的迭代器。找到匹配的所有子串,并把它們作為一個迭代器返回。
2) 實(shí)例
importre
pattern= re.compile(r'\d+')print(pattern.finditer('one1two2three3four4'))
for m in pattern.finditer('one1two2three3four4'):print(m)print(m.group())_sre.SRE_Match object; span=(3, 4), match='1'
1
_sre.SRE_Match object; span=(7, 8), match='2'
2
_sre.SRE_Match object; span=(13, 14), match='3'
3
_sre.SRE_Match object; span=(18, 19), match='4'
4
7. re.split(pattern, string, [maxsplit=0, flags=0]) | split(string, [maxsplit])
1) 作用:按照能夠匹配的子串將字符串分割后返回列表
pattern:匹配的正則表達(dá)式
string:要匹配的字符串
maxsplit:分割次數(shù),maxsplit=1 分割一次,默認(rèn)為0,不限制次數(shù)
flags:標(biāo)志位,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫、多行匹配等
2) 實(shí)例1
importre
pattern= re.compile(r'\d+')print(pattern.split('one1two2three3four4'))
['one', 'two', 'three', 'four', ''] #注意后面沒有內(nèi)容,是一個''字符
實(shí)例2
importre#匹配\W+表示非單詞字符一次或無數(shù)次
pattern = re.compile(r'\W+')#用非單詞字符分割
print(pattern.split('hello, world'))
['hello', 'world']
使用帶括號的正則表達(dá)式則可以將正則表達(dá)式匹配的內(nèi)容也添加到列表內(nèi)
importre#帶括號的正則表達(dá)式則可以將正則表達(dá)式匹配的內(nèi)容也添加到列表內(nèi)
pattern = re.compile(r'(\W+)')print(pattern.split('hello, world'))
['hello', ', ', 'world']
正則表達(dá)式是一個特殊的字符序列,可以幫助您使用模式中保留的專門語法來匹配或查找其他字符串或字符串集。 正則表達(dá)式在UNIX世界中被廣泛使用。
注:很多開發(fā)人員覺得正則表達(dá)式比較難以理解,主要原因是缺少使用或不愿意在這上面花時間。
re模塊在Python中提供對Perl類正則表達(dá)式的完全支持。如果在編譯或使用正則表達(dá)式時發(fā)生錯誤,則re模塊會引發(fā)異常re.error。
在這篇文章中,將介紹兩個重要的功能,用來處理正則表達(dá)式。 然而,首先是一件小事:有各種各樣的字符,這些字符在正則表達(dá)式中使用時會有特殊的意義。 為了在處理正則表達(dá)式時避免混淆,我們將使用:r'expression'原始字符串。
匹配單個字符的基本模式
編譯標(biāo)志可以修改正則表達(dá)式的某些方面。標(biāo)志在re模塊中有兩個名稱:一個很長的名稱,如IGNORECASE,和一個簡短的單字母形式,如。
1.match函數(shù)
此函數(shù)嘗試將RE模式與可選標(biāo)志的字符串進(jìn)行匹配。
下面是函數(shù)的語法 :
這里是參數(shù)的描述 :
pattern : 這是要匹配的正則表達(dá)式。
string : 這是字符串,它將被搜索用于匹配字符串開頭的模式。 |
flags : 可以使用按位OR(|)指定不同的標(biāo)志。 這些是修飾符,如下表所列。
re.match函數(shù)在成功時返回匹配對象,失敗時返回None。使用match(num)或groups()函數(shù)匹配對象來獲取匹配的表達(dá)式。
示例
當(dāng)執(zhí)行上述代碼時,會產(chǎn)生以下結(jié)果 :
2.search函數(shù)
此函數(shù)嘗試將RE模式與可選標(biāo)志的字符串進(jìn)行匹配。
下面是這個函數(shù)的語法 :
這里是參數(shù)的描述 :
pattern : 這是要匹配的正則表達(dá)式。
string : 這是字符串,它將被搜索用于匹配字符串開頭的模式。 |
flags : 可以使用按位OR(|)指定不同的標(biāo)志。 這些是修飾符,如下表所列。
re.search函數(shù)在成功時返回匹配對象,否則返回None。使用match對象的group(num)或groups()函數(shù)來獲取匹配的表達(dá)式。
示例
當(dāng)執(zhí)行上述代碼時,會產(chǎn)生以下結(jié)果 :
3.匹配與搜索
Python提供基于正則表達(dá)式的兩種不同的原始操作:match檢查僅匹配字符串的開頭,而search檢查字符串中任何位置的匹配(這是Perl默認(rèn)情況下的匹配)。
示例
當(dāng)執(zhí)行上述代碼時,會產(chǎn)生以下結(jié)果 :
4.搜索和替換
使用正則表達(dá)式re模塊中的最重要的之一是sub。
模塊
此方法使用repl替換所有出現(xiàn)在RE模式的字符串,替換所有出現(xiàn),除非提供max。此方法返回修改的字符串。
示例
當(dāng)執(zhí)行上述代碼時,會產(chǎn)生以下結(jié)果 :
5.正則表達(dá)式修飾符:選項(xiàng)標(biāo)志
正則表達(dá)式文字可能包含一個可選修飾符,用于控制匹配的各個方面。 修飾符被指定為可選標(biāo)志??梢允褂卯惢?|)提供多個修飾符,如前所示,可以由以下之一表示 :
6.正則表達(dá)模式
除了控制字符(+ ? . * ^ $ ( ) [ ] { } | ),所有字符都與其自身匹配。 可以通過使用反斜杠將其轉(zhuǎn)換為控制字符。
7.正則表達(dá)式示例
字符常量
字符類
特殊字符類
重復(fù)匹配
非貪婪重復(fù)
這匹配最小的重復(fù)次數(shù) :
用圓括號分組
反向引用
這與以前匹配的組再次匹配 :
備擇方案
python|perl : 匹配“python”或“perl”
rub(y|le) : 匹配 “ruby” 或 “ruble”
Python(!+|?) : “Python”后跟一個或多個! 還是一個?
錨點(diǎn)
這需要指定匹配位置。
帶括號的特殊語法
開課吧廣場-人才學(xué)習(xí)交流平臺-開課吧
match()和search()都是python中的正則匹配函數(shù),那這兩個函數(shù)有何區(qū)別呢?
match()函數(shù)只檢測RE是不是在string的開始位置匹配, search()會掃描整個string查找匹配, 也就是說match()只有在0位置匹配成功的話才有返回,如果不是開始位置匹配成功的話,match()就返回none
例如:
#! /usr/bin/env python
# -*- coding=utf-8 -*-
import re
text = 'pythontab'
m = re.match(r"\w+", text)
if m:
print m.group(0)
else:
print 'not match'
結(jié)果是:pythontab
而:
#! /usr/bin/env python
# -*- coding=utf-8 -*-
#
import re
text = '@pythontab'
m = re.match(r"\w+", text)
if m:
print m.group(0)
else:
print 'not match'
結(jié)果是:not match
search()會掃描整個字符串并返回第一個成功的匹配
例如:
#! /usr/bin/env python
# -*- coding=utf-8 -*-
#
import re
text = 'pythontab'
m = re.search(r"\w+", text)
if m:
print m.group(0)
else:
print 'not match'
結(jié)果是:pythontab
那這樣呢:
#! /usr/bin/env python
# -*- coding=utf-8 -*-
#
import re
text = '@pythontab'
m = re.search(r"\w+", text)
if m:
print m.group(0)
else:
print 'not match'
結(jié)果是:pythontab
字符串的匹配查詢
Python中的re模塊中的findall函數(shù)可以對指定的字符串進(jìn)行遍歷匹配,如下:
findall(pattern, string, flags=0)
pattern:指定需要匹配的正則表達(dá)式。
string:指定待處理的字符串。
flags:指定匹配模式,常用的值可以是re.I、re.M、re.S和re.X。re.I的模式是讓正則表達(dá)式對大小寫不敏感;re.M的模式是讓正則表達(dá)式可以多行匹配;re.S的模式指明正則符號.可以匹配任意字符,包括換行符 ;re.X模式允許正則表達(dá)式可以寫得更加詳細(xì),如多行表示、忽略空白字符、加入注釋等。
字符串的匹配替換
re模塊中的sub函數(shù)的功能是替換,類似于字符串的replace方法,該函數(shù)根據(jù)正則表達(dá)式把滿足匹配的內(nèi)容替換為repl,如下:
sub(pattern, repl, string, count=0, flags=0)
pattern:同findall函數(shù)中的pattern。
repl:指定替換成的新值。
string:同findall函數(shù)中的string。
count:用于指定最多替換的次數(shù),默認(rèn)為全部替換。
flags:同findall函數(shù)。
字符串的匹配分割
re模塊中的split函數(shù)是將字符串按照指定的正則表達(dá)式分隔開,類似于字符串的split,如下:
split(pattern, string, maxsplit=0, flags=0)
pattern:同findall函數(shù)中的pattern。
maxsplit:用于指定最大分割次數(shù),默認(rèn)為全部分割。
string:同findall函數(shù)中的string。
flags:同findall函數(shù)中的flags。
以上就是本次分享的全部內(nèi)容了,不知大家對我講述的Python正則表達(dá)式妙用感覺怎么樣?
腦筋急轉(zhuǎn)彎:有人想喝點(diǎn)牛奶解渴,卻一命嗚呼了,為什么?