java string 返回匹配正则的字符串的起始位置_Python小课堂正则表达式
Python3 正則表達(dá)式
正則表達(dá)式是一個(gè)特殊的字符序列,它能幫助你方便的檢查一個(gè)字符串是否與某種模式匹配。
Python 自1.5版本起增加了re 模塊,它提供 Perl 風(fēng)格的正則表達(dá)式模式。
re 模塊使 Python 語(yǔ)言擁有全部的正則表達(dá)式功能。
compile 函數(shù)根據(jù)一個(gè)模式字符串和可選的標(biāo)志參數(shù)生成一個(gè)正則表達(dá)式對(duì)象。該對(duì)象擁有一系列方法用于正則表達(dá)式匹配和替換。
re 模塊也提供了與這些方法功能完全一致的函數(shù),這些函數(shù)使用一個(gè)模式字符串做為它們的第一個(gè)參數(shù)。
本章節(jié)主要介紹 Python 中常用的正則表達(dá)式處理函數(shù)。
01
re.match函數(shù)
re.match 嘗試從字符串的起始位置匹配一個(gè)模式,如果不是起始位置匹配成功的話,match()就返回none。
函數(shù)語(yǔ)法:
re.match(pattern, string, flags=0)
函數(shù)參數(shù)說(shuō)明:
匹配成功re.match方法返回一個(gè)匹配的對(duì)象,否則返回None。
我們可以使用group(num) 或 groups() 匹配對(duì)象函數(shù)來(lái)獲取匹配表達(dá)式。
實(shí)例如下:
#!/usr/bin/python
import re
print(re.match('www','www.runoob.com').span())# 在起始位置匹配
print(re.match('com', 'www.runoob.com'))? # 不在起始位置匹配
以上實(shí)例運(yùn)行輸出結(jié)果為:
(0, 3)
None
再看一實(shí)例:
#!/usr/bin/python3
import re
line = "Cats are smarter than dogs"
# .* 表示任意匹配除換行符(\n、\r)之外的任何單個(gè)或多個(gè)字符
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
if matchObj:
? ?print ("matchObj.group() : ", matchObj.group())
? ?print ("matchObj.group(1) : ", matchObj.group(1))
? ?print ("matchObj.group(2) : ", matchObj.group(2))
else:
? ?print ("No match!!")
以上實(shí)例執(zhí)行結(jié)果如下:
matchObj.group() :? Cats are smarter than dogs
matchObj.group(1) :? Cats
matchObj.group(2) :? smarter
02
re.search方法
re.search 掃描整個(gè)字符串并返回第一個(gè)成功的匹配。
函數(shù)語(yǔ)法:
re.search(pattern, string, flags=0)
函數(shù)參數(shù)說(shuō)明:
匹配成功re.search方法返回一個(gè)匹配的對(duì)象,否則返回None。
我們可以使用group(num) 或 groups() 匹配對(duì)象函數(shù)來(lái)獲取匹配表達(dá)式。
實(shí)例如下:
#!/usr/bin/python3
import re
line = "Cats are smarter than dogs"
searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)
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!!")
以上實(shí)例執(zhí)行結(jié)果如下:
searchObj.group() :? Cats are smarter than dogs
searchObj.group(1) :? Cats
searchObj.group(2) :? smarter
03
re.match與re.search的區(qū)別
re.match 只匹配字符串的開(kāi)始,如果字符串開(kāi)始不符合正則表達(dá)式,則匹配失敗,函數(shù)返回 None,而 re.search 匹配整個(gè)字符串,直到找到一個(gè)匹配。
實(shí)例如下:
#!/usr/bin/python3
import re
line = "Cats are smarter than dogs"
matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
? ?print ("match --> matchObj.group() : ", matchObj.group())
else:
? ?print ("No match!!")
matchObj = re.search( r'dogs', line, re.M|re.I)
if matchObj:
? ?print ("search --> matchObj.group() : ", matchObj.group())
else:
? ?print ("No match!!")
以上實(shí)例運(yùn)行結(jié)果如下:
No match!!
search --> matchObj.group() :? dogs
04
檢索和替換
Python 的re模塊提供了re.sub用于替換字符串中的匹配項(xiàng)。
函數(shù)語(yǔ)法:
re.sub(pattern, repl, string, count=0, flags=0)
參數(shù):
pattern : 正則中的模式字符串。
repl : 替換的字符串,也可為一個(gè)函數(shù)。
string : 要被查找替換的原始字符串。
count : 模式匹配后替換的最大次數(shù),默認(rèn) 0 表示替換所有的匹配。
flags : 編譯時(shí)用的匹配模式,數(shù)字形式。
前三個(gè)為必選參數(shù),后兩個(gè)為可選參數(shù)。
實(shí)例如下:
#!/usr/bin/python3
import re
phone = "2004-959-559 # 這是一個(gè)電話號(hào)碼"
# 刪除注釋
num = re.sub(r'#.*$', "", phone)
print ("電話號(hào)碼 : ", num)
# 移除非數(shù)字的內(nèi)容
num = re.sub(r'\D', "", phone)
print ("電話號(hào)碼 : ", num)
以上實(shí)例執(zhí)行結(jié)果如下:
電話號(hào)碼 :? 2004-959-559?
電話號(hào)碼 :? 2004959559
repl 參數(shù)是一個(gè)函數(shù)
以下實(shí)例中將字符串中的匹配的數(shù)字乘于 2:
#!/usr/bin/python
import re
# 將匹配的數(shù)字乘于 2
def double(matched):
? ? value = int(matched.group('value'))
? ? return str(value * 2)
s = 'A23G4HFD567'
print(re.sub('(?P\d+)', double, s))
執(zhí)行輸出結(jié)果為:
A46G8HFD1134
compile 函數(shù)
compile 函數(shù)用于編譯正則表達(dá)式,生成一個(gè)正則表達(dá)式( Pattern )對(duì)象,供 match() 和 search() 這兩個(gè)函數(shù)使用。
語(yǔ)法格式:
re.compile(pattern[, flags])
參數(shù):
pattern : 一個(gè)字符串形式的正則表達(dá)式
flags 可選,表示匹配模式,比如忽略大小寫(xiě),多行模式等,具體參數(shù)為:
re.I 忽略大小寫(xiě)
re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依賴于當(dāng)前環(huán)境
re.M 多行模式
re.S 即為' . '并且包括換行符在內(nèi)的任意字符(' . '不包括換行符)
re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依賴于 Unicode 字符屬性數(shù)據(jù)庫(kù)
re.X 為了增加可讀性,忽略空格和' # '后面的注釋
實(shí)例如下:
>>>import re
>>> pattern = re.compile(r'\d+')? ? ? ? ? ? ? ? ? ? # 用于匹配至少一個(gè)數(shù)字
>>> m = pattern.match('one12twothree34four')? ? ? ? # 查找頭部,沒(méi)有匹配
>>> print( m )
None
>>> m = pattern.match('one12twothree34four', 2, 10) # 從'e'的位置開(kāi)始匹配,沒(méi)有匹配
>>> print( m )
None
>>> m = pattern.match('one12twothree34four', 3, 10) # 從'1'的位置開(kāi)始匹配,正好匹配
>>> print( m )? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 返回一個(gè) Match 對(duì)象
>>> m.group(0)? ?# 可省略 0
'12'
>>> m.start(0)? ?# 可省略 0
3
>>> m.end(0)? ? ?# 可省略 0
5
>>> m.span(0)? ? # 可省略 0
(3, 5)
在上面,當(dāng)匹配成功時(shí)返回一個(gè) Match 對(duì)象,其中:
group([group1, …]) 方法用于獲得一個(gè)或多個(gè)分組匹配的字符串,當(dāng)要獲得整個(gè)匹配的子串時(shí),可直接使用 group() 或 group(0);
start([group]) 方法用于獲取分組匹配的子串在整個(gè)字符串中的起始位置(子串第一個(gè)字符的索引),參數(shù)默認(rèn)值為 0;
end([group]) 方法用于獲取分組匹配的子串在整個(gè)字符串中的結(jié)束位置(子串最后一個(gè)字符的索引+1),參數(shù)默認(rèn)值為 0;
span([group]) 方法返回 (start(group), end(group))。
再看一個(gè)例子:
>>>import re
>>> pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I)? ?# re.I 表示忽略大小寫(xiě)
>>> m = pattern.match('Hello World Wide Web')
>>> print( m )? ? ? ? ? ? ? ? ? ? ? ? ? ? # 匹配成功,返回一個(gè) Match 對(duì)象
>>> m.group(0)? ? ? ? ? ? ? ? ? ? ? ? ? ? # 返回匹配成功的整個(gè)子串
'Hello World'
>>> m.span(0)? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 返回匹配成功的整個(gè)子串的索引
(0, 11)
>>> m.group(1)? ? ? ? ? ? ? ? ? ? ? ? ? ? # 返回第一個(gè)分組匹配成功的子串
'Hello'
>>> m.span(1)? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 返回第一個(gè)分組匹配成功的子串的索引
(0, 5)
>>> m.group(2)? ? ? ? ? ? ? ? ? ? ? ? ? ? # 返回第二個(gè)分組匹配成功的子串
'World'
>>> m.span(2)? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 返回第二個(gè)分組匹配成功的子串索引
(6, 11)
>>> m.groups()? ? ? ? ? ? ? ? ? ? ? ? ? ? # 等價(jià)于 (m.group(1), m.group(2), ...)
('Hello', 'World')
>>> m.group(3)? ? ? ? ? ? ? ? ? ? ? ? ? ? # 不存在第三個(gè)分組
Traceback (most recent call last):
? File "", line 1, in
IndexError: no such group
findall
在字符串中找到正則表達(dá)式所匹配的所有子串,并返回一個(gè)列表,如果沒(méi)有找到匹配的,則返回空列表。
注意:match 和 search 是匹配一次 findall 匹配所有。
語(yǔ)法格式:
re.findall(pattern, string, flags=0)
或
pattern.findall(string[, pos[, endpos]])
參數(shù):
pattern:匹配模式。
string:待匹配的字符串。
pos:可選參數(shù),指定字符串的起始位置,默認(rèn)為 0。
endpos:可選參數(shù),指定字符串的結(jié)束位置,默認(rèn)為字符串的長(zhǎng)度。
查找字符串中的所有數(shù)字:
import re
result1 = re.findall(r'\d+','runoob 123 google 456')
pattern = re.compile(r'\d+')? ?# 查找數(shù)字
result2 = pattern.findall('runoob 123 google 456')
result3 = pattern.findall('run88oob123google456', 0, 10)
print(result1)
print(result2)
print(result3)
輸出結(jié)果:
['123', '456']
['123', '456']
['88', '12']
re.finditer
和 findall 類(lèi)似,在字符串中找到正則表達(dá)式所匹配的所有子串,并把它們作為一個(gè)迭代器返回。
re.finditer(pattern, string, flags=0)
參數(shù):
實(shí)例如下:
import re
it = re.finditer(r"\d+","12a32bc43jf3")?
for match in it:?
? ? print (match.group() )
輸出結(jié)果:
12?
32?
43?
3
re.split
split 方法按照能夠匹配的子串將字符串分割后返回列表,它的使用形式如下:
re.split(pattern, string[, maxsplit=0, flags=0])
參數(shù)如下:
實(shí)例如下:
>>>import re
>>> re.split('\W+', 'runoob, runoob, runoob.')
['runoob', 'runoob', 'runoob', '']
>>> re.split('(\W+)', ' runoob, runoob, runoob.')?
['', ' ', 'runoob', ', ', 'runoob', ', ', 'runoob', '.', '']
>>> re.split('\W+', ' runoob, runoob, runoob.', 1)?
['', 'runoob, runoob, runoob.']
>>> re.split('a*', 'hello world')? ?# 對(duì)于一個(gè)找不到匹配的字符串而言,split 不會(huì)對(duì)其作出分割
['hello world']
05
正則表達(dá)式對(duì)象
re.RegexObject
re.compile() 返回 RegexObject 對(duì)象。
re.MatchObject
group() 返回被 RE 匹配的字符串。
start() 返回匹配開(kāi)始的位置
end() 返回匹配結(jié)束的位置
span() 返回一個(gè)元組包含匹配 (開(kāi)始,結(jié)束) 的位置
06
正則表達(dá)式修飾符 - 可選標(biāo)志
正則表達(dá)式可以包含一些可選標(biāo)志修飾符來(lái)控制匹配的模式。修飾符被指定為一個(gè)可選的標(biāo)志。多個(gè)標(biāo)志可以通過(guò)按位 OR(|) 它們來(lái)指定。如 re.I | re.M 被設(shè)置成 I 和 M 標(biāo)志:
07
正則表達(dá)式模式
模式字符串使用特殊的語(yǔ)法來(lái)表示一個(gè)正則表達(dá)式:
字母和數(shù)字表示他們自身。一個(gè)正則表達(dá)式模式中的字母和數(shù)字匹配同樣的字符串。
多數(shù)字母和數(shù)字前加一個(gè)反斜杠時(shí)會(huì)擁有不同的含義。
標(biāo)點(diǎn)符號(hào)只有被轉(zhuǎn)義時(shí)才匹配自身,否則它們表示特殊的含義。
反斜杠本身需要使用反斜杠轉(zhuǎn)義。
由于正則表達(dá)式通常都包含反斜杠,所以你最好使用原始字符串來(lái)表示它們。模式元素(如 r'\t',等價(jià)于 \\t )匹配相應(yīng)的特殊字符。
下表列出了正則表達(dá)式模式語(yǔ)法中的特殊元素。如果你使用模式的同時(shí)提供了可選的標(biāo)志參數(shù),某些模式元素的含義會(huì)改變。
08
正則表達(dá)式實(shí)例
字符匹配
字符類(lèi)
特殊字符類(lèi)
?Python小課堂?
?每周一見(jiàn)?
來(lái)源:菜鳥(niǎo)教程
排版:張立成
責(zé)任編輯:楊芷毓? ?微信審核:劉婷
總結(jié)
以上是生活随笔為你收集整理的java string 返回匹配正则的字符串的起始位置_Python小课堂正则表达式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python代码图片头像_Python帮
- 下一篇: python pandas读取csv_P