python使用正則匹配判斷字符串中含有某些特定子串及正則表達(dá)式詳解
一、判斷字符串中是否含有字串
1. in,not in
判斷字符串中是否含有某些關(guān)鍵詞,方法比較多
例如分詞后對詞向量和關(guān)鍵詞進(jìn)行==匹配,但這種方法以來分詞的準(zhǔn)確性,不太推薦;
其次使用成員運(yùn)算符in,not in可以較好的判斷字符串中是否包含某關(guān)鍵詞,即特定字串
a = '這個(gè)暑假我讀了紅樓夢和三國演義'
b= ['三國演義','水滸傳','西游記','紅樓夢']
n = 0
for i in b:
if i in a:
n += 1
print(f'四大名著暑假讀了{(lán)n}本')這種遍歷算法雖然可以成功得到想要的結(jié)果,但是當(dāng)數(shù)據(jù)量很大的時(shí)候,程序執(zhí)行效率將會很低。正則匹配作為專業(yè)的查找工具,在判斷字符串中含有特定字串的事情上可以大大提高工作效率。
2.正則匹配re.findall
import re
def is_in(fullstr,substr):
if re.findall(substr,fullstr):
return 1
else:
return 0
a = '這個(gè)暑假我讀了紅樓夢和三國演義'
b= ['三國演義','水滸傳','西游記','紅樓夢']
n = 0
for i in b:
n = is_in(a,i)
n += 1
print(f'四大名著暑假讀了{(lán)n}本')findall:返回string中所有與pattern匹配的全部字符串,返回形式為數(shù)組
re.findall(pattern, string, flags=0)
示例如下:
line = []
n = 0
for i in b:
num = is_in(a,i)
n += num
res = re.findall(i,a)
line = line + res
print(f'四大名著暑假讀了{(lán)n}本')
print(f'分別是{line}')
'''
res = re.findall(i,a) re.findall返回值是一個(gè)列表
out:
四大名著暑假讀了2本
分別是['三國演義', '紅樓夢']
'''正則的功能十分強(qiáng)大,上述使用的只是其中一個(gè)很小的功能。下面繼續(xù)對正則的強(qiáng)大功能進(jìn)行學(xué)習(xí)
二、正則表達(dá)式
(一)基本內(nèi)容
1.正則表達(dá)式修飾符——可選標(biāo)志
正則表達(dá)式可以包含一些可選標(biāo)志修飾符來控制匹配的模式。修飾符被指定為一個(gè)可選的標(biāo)志。多個(gè)標(biāo)志可以通過按位 OR(|) 它們來指定。如 re.I | re.M 被設(shè)置成 I 和 M 標(biāo)志
| 修飾符 | 功能 | 全稱 |
|---|---|---|
| re.I | 匹配忽略大小寫 | re.IGNORECASE |
| re.L | 做本地化識別(locale-aware)匹配,即表示特殊字符集 \w, \W, \b, \B, \s, \S 依賴于當(dāng)前環(huán)境(該標(biāo)記官方已經(jīng)不推薦使用) | re.LOCALE |
| re.M | 多行匹配,影響 ^ 和 $(正則表達(dá)式中^表示匹配行的開頭,默認(rèn)模式下它只能匹配字符串的開頭;而在多行模式下,它還可以匹配 換行符\n后面的字符。NOTE:正則語法中^匹配行開頭、\A匹配字符串開頭,單行模式下它兩效果一致,多行模式下\A不能識別\n) | re.MULTILINE |
| re.S | 使·. 匹配包括換行在內(nèi)的所有字符(DOT表示.,ALL表示所有,連起來就是.匹配所有,包括換行符\n。默認(rèn)模式下.是不能匹配行符\n的) | re.DOTALL |
| re.U | 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依賴于 Unicode 字符屬性數(shù)據(jù)庫(與 ASCII 模式類似,匹配unicode編碼支持的字符,但是 Python 3 默認(rèn)字符串已經(jīng)是Unicode,所以有點(diǎn)冗余) | re.UNICODE |
| re.X | 增加可讀性,忽略空格和 # 后面的注釋 (默認(rèn)模式下并不能識別正則表達(dá)式中的注釋,而詳細(xì)模式是可以識別的) | re.VERBOSE |
| re.A | 讓 \w, \W, \b, \B, \d, \D, \s 和 \S 只匹配ASCII,而不是Unicode | re.ASCII |
| re.DEBUG | 顯示編譯時(shí)的debug信息 | re.DEBUG |
2.正則表達(dá)式模式
模式字符串使用特殊的語法來表示一個(gè)正則表達(dá)式:
(1)字母和數(shù)字表示他們自身。一個(gè)正則表達(dá)式模式中的字母和數(shù)字匹配同樣的字符串。
(2)多數(shù)字母和數(shù)字前加一個(gè)反斜杠時(shí)會擁有不同的含義,例如\n 表示換行。
(3)標(biāo)點(diǎn)符號只有被轉(zhuǎn)義時(shí)才匹配自身,否則它們表示特殊的含義。
(4)反斜杠本身需要使用反斜杠轉(zhuǎn)義。
(5)由于正則表達(dá)式通常都包含反斜杠,所以最好使用原始字符串來表示它們。模式元素(如 r'\t',等價(jià)于 '\\t')匹配相應(yīng)的特殊字符。
下表列出了正則表達(dá)式模式語法中的特殊元素。如果使用模式的同時(shí)提供了可選的標(biāo)志參數(shù),某些模式元素的含義會改變。
| 模式 | 功能 | 示例 | 匹配的字符串 |
|---|---|---|---|
^ | 匹配字符串的開頭 | ||
$ | 匹配字符串的結(jié)尾 | ||
. | 匹配任意字符,除了換行符\n | ||
[…] | 表示一組字符單獨(dú)列出 | [like] | 'l','i','k' 'e' |
[^…] | 表示不在[]中的字符 | [^like] | 除了'l','i','k' ,e之外的字符 |
\w | 匹配字母數(shù)字及下劃線 | a-z、A-Z、0-9、_ | |
\W | 匹配非字母數(shù)字及下劃線 | ||
\s | 匹配任意空白字符,等價(jià)于 \t \n \r \f | ||
\S | 匹配任意非空字符 | ||
\d | 匹配任意數(shù)字,等價(jià)于 [0-9] | ||
\D | 匹配任意非數(shù)字 | ||
\A | 匹配字符串開始 | ||
\z | 匹配字符串結(jié)束 | ||
\Z | 匹配字符串結(jié)束,如果是存在換行,只匹配到換行前的結(jié)束字符串 | ||
\G | 匹配最后匹配完成的位置 | ||
\b | 匹配一個(gè)單詞邊界,也就是指單詞和空格間的位置 | er\b | never (√),verb(×) |
\B | 匹配非單詞邊界 | er\b | never (×),verb(√) |
\n \t等 | 匹配一個(gè)換行符。匹配一個(gè)制表符。等 | ||
\1 …\9 | 匹配第n個(gè)分組的內(nèi)容 | ||
\10 | 匹配第n個(gè)分組的內(nèi)容,如果它經(jīng)匹配。否則指的是八進(jìn)制字符碼的表達(dá)式 | ||
re* | (* 貪婪)匹配0個(gè)或多個(gè)表達(dá)式(前一個(gè)字符出現(xiàn)0次或者?限次,即可有可?) | abc* | abccc |
re+ | (+懶惰)匹配1個(gè)或多個(gè)的表達(dá)式(前一個(gè)字符出現(xiàn)1次或者?限次,即?少有1次) | abc+ | abc abcccc |
re? | (?占有)匹配0個(gè)或1個(gè)由前面的正則表達(dá)式定義的片段,非貪婪方式(前一個(gè)字符出現(xiàn)1次或者0次,即要么有1次,要么沒有) | abc? | abc ab |
re{n} | 前一個(gè)字符出現(xiàn)n次 | o{2} | food |
{m,n} | 匹配前?個(gè)字符出現(xiàn)從m到n次,若省略m,則匹配0到n次,若省略n,則匹配m到無限次 | ab{1,2}c | abc abbc |
a |b | 匹配a或b | ||
(re) | 對正則表達(dá)式分組并記住匹配的文本 | ||
\num | 引?分組num匹配到的字符串 | ||
(?P<name>) | 分組起別名,匹配到的子串組在外部是通過定義的 name 來獲取的 | ||
(?P=name) | 引?別名為name分組匹配到的字符串 |
(二)常見表達(dá)式函數(shù)
正則表達(dá)式是一個(gè)特殊的字符序列,可以方便的檢查一個(gè)字符串是否與某種模式匹配,python自帶的re模塊使 Python 語言擁有全部的正則表達(dá)式功能
python常用的正則表達(dá)式函數(shù)如下:
| 功能分類 | 函數(shù) | 功能 | ||||
|---|---|---|---|---|---|---|
查找一個(gè)匹配項(xiàng) | re.search | 查找任意位置的匹配項(xiàng) | ||||
re.match | 必須從字符串開頭匹配 | |||||
re.fullmatch | 整個(gè)字符串與正則完全匹配 | |||||
查找多個(gè)匹配項(xiàng) | re.findall | 從字符串任意位置查找,返回一個(gè)列表 | ||||
re.finditer | 從字符串任意位置查找,返回一個(gè)迭代器 | |||||
分割 | re.split | 用正則表達(dá)式將某字符串分割成多段 | ||||
替換 | re.sub | 替換掉某字符串中被正則表達(dá)式匹配的字符,返回替換后的字符串,替換可以是字符串 也可以是 函數(shù) | ||||
re.subn | 替換掉某字符串中被正則表達(dá)式匹配的字符,返回替換后的字符串 和 替換次數(shù) | |||||
編譯正則對象 | re.compile | 將正則表達(dá)式的樣式編譯為一個(gè) 正則表達(dá)式對象 (正則對象Pattern) | ||||
re.template | 將正則表達(dá)式的樣式編譯為一個(gè) 正則表達(dá)式對象 ,并添加re.TEMPLATE模式 | |||||
其他 | re.escape | 可以轉(zhuǎn)義正則表達(dá)式中具有特殊含義的字符,比如: . 或者 * | ||||
re.purge | 清除正則表達(dá)式緩存 | |||||
1. re.match
re.match 嘗試從字符串的起始位置匹配一個(gè)模式,如果不是起始位置匹配成功的話,match() 就返回 none
re.match(pattern, string, flags=0)
| 參數(shù) | 說明 |
|---|---|
| pattern | 匹配的正則表達(dá)式 |
| string | 要匹配的字符串 |
| flags | 標(biāo)志位,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等。詳見表1修飾符 |
匹配成功 re.match 方法返回一個(gè)匹配的對象,否則返回 None
可以使用 group(num) 或 groups() 匹配對象函數(shù)來獲取匹配表達(dá)式
| 匹配對象方法 | 描述 |
|---|---|
| group(num=0) | 匹配的整個(gè)表達(dá)式的字符串,group() 可以一次輸入多個(gè)組號,在這種情況下它將返回一個(gè)包含那些組所對應(yīng)值的元組 |
| groups() | 返回一個(gè)包含所有小組字符串的元組,從 1 到 所含的小組號 |
0:表示正則表達(dá)式中符合條件的字符串。
1:表示正則表達(dá)式中符合條件的字符串中的第一個(gè)() 中的字符串。
2:表示正則表達(dá)式中符合條件的字符串中的第二個(gè)() 中的字符串。
以此類推…
import re
fullstr = 'name:alice,result:89'
result = re.match('name:(\w+),result:(\d+)', fullstr)
print(result)
print(result.group(0))
print(result.group(1))
print(result.group(2))
print(result.group())結(jié)果:
out1: <re.Match object; span=(0, 20), match=‘name:alice,result:89’>
out2: name:alice,result:89
out3: alice
out4: 89
out5: name:alice,result:89
從結(jié)果可以看出,re.match()方法返回一個(gè)匹配的對象,而不是匹配的內(nèi)容。通過調(diào)用span()可以獲得匹配結(jié)果的位置。而如果從起始位置開始沒有匹配成功,即便其他部分包含需要匹配的內(nèi)容,re.match()也會返回None
可以使用group()來提取每組匹配到的字符串。
group()會返回一個(gè)包含所有小組字符串的元組,從 0 到 所含的小組號
注意:如果在運(yùn)用正則表達(dá)式做匹配的過程中沒有匹配到元素,之后又調(diào)用了group(),會報(bào)錯(cuò):AttributeError: 'NoneType' object has no attribute 'group'
如果出現(xiàn)這種報(bào)錯(cuò),可以將match改成search()就可以避開這類問題了。search函數(shù)是先掃描全部的代碼塊,再進(jìn)行提取的
2.re.search
re.search會匹配整個(gè)字符串,并返回第一個(gè)成功的匹配。如果匹配失敗,則返回None
re.search(pattern, string, flags=0)
參數(shù)同re.match
示例:
import re
fullstr = 'class:1班,name:alice,result:89'
result = re.match('name:(\w+),result:(\d+)', fullstr)
print(result)
print(result.group(0))out1: None
out2: AttributeError: ‘NoneType’ object has no attribute ‘group’
原因:match在起始位置匹配,如果不是起始位置匹配成功的話,match() 就返回 none
嘗試search
import re
fullstr = 'class:1班,name:alice,result:89'
result = re.search('name:(\w+),result:(\d+)', fullstr)
print(result)
print(result.group(0))
print(result.group(1))
print(result.group(2))
print(result.group())out1: <re.Match object; span=(9, 29), match=‘name:alice,result:89’>
out2: name:alice,result:89
out3: alice
out4: 89
out5: name:alice,result:89
3. re.sub
該函數(shù)主要用于替換字符串中的匹配項(xiàng)
re.sub(pattern, repl, string, count=0, flags=0)
示例如下:
| 參數(shù) | 說明 |
|---|---|
| pattern | 必須參數(shù):正則中的模式字符串 |
| repl | 必須參數(shù):替換的字符串,也可為一個(gè)函數(shù) |
| string | 必須參數(shù),要被查找替換的原始字符串 |
| count | 可選參數(shù),模式匹配后替換的最大次數(shù),默認(rèn) 0 表示替換所有的匹配 |
| flags | 可選參數(shù),表示編譯時(shí)用的匹配模式(如忽略大小寫、多行模式等),數(shù)字形式,默認(rèn)為0 |
#修改分?jǐn)?shù) fullstr = 'name:alice,result:89' res1 = re.sub(r'\d+','90',fullstr) print(res1)
out: name:alice,result:90
repl可以為一個(gè)函數(shù)。如下:
#修改分?jǐn)?shù)
def change(matched):
value = int(matched.group('value'))
return str(value + 1)
fullstr = 'name:alice,result:89'
res1 = re.sub('(?P<value>\d+)',change,fullstr)
print(res1)out: name:alice,result:90
4.re.compile
compile 函數(shù)用于編譯正則表達(dá)式,生成一個(gè)正則表達(dá)式( Pattern )對象,供 match() 和 search() 這兩個(gè)函數(shù)使用
re 模塊的一般使用步驟是:
1.使用 compile 函數(shù)將正則表達(dá)式的字符串形式編譯為一個(gè) Pattern 對象
2.通過 Pattern 對象提供的一系列方法對文本進(jìn)行匹配查找,獲得匹配結(jié)果(一個(gè) Match 對象)
3.最后使用 Match 對象提供的屬性和方法獲得信息,根據(jù)需要進(jìn)行其他的操作里是引用
re.compile(pattern, flags)
compile返回的是一個(gè)匹配對象,它單獨(dú)使用就沒有任何意義,需要和findall(), search(), match()搭配使用
5.re.findall
在字符串中找到正則表達(dá)式所匹配的所有子串,并返回一個(gè)列表,如果有多個(gè)匹配模式,則返回元組列表,如果沒有找到匹配的,則返回空列表
注: match 和 search 是匹配一次 findall 匹配所有
6.re.split
re.split(pattern, string[, maxsplit=0, flags=0])
到此這篇關(guān)于python使用正則匹配判斷字符串中含有某些特定子串 及 正則表達(dá)式詳解的文章就介紹到這了,更多相關(guān)python正則表達(dá)式判斷字符串中是否含有字串內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
正則表達(dá)式中環(huán)視的簡單應(yīng)用示例【基于java】
這篇文章主要介紹了正則表達(dá)式中環(huán)視的簡單應(yīng)用,簡單分析了環(huán)視的概念與功能,并基于java給出了正則表達(dá)式環(huán)視的具體使用技巧,需要的朋友可以參考下2017-04-04
javascript之正則表達(dá)式基礎(chǔ)知識小結(jié)
javascript之正則表達(dá)式基礎(chǔ)知識小結(jié),對于學(xué)習(xí)正則表達(dá)式的朋友是個(gè)不錯(cuò)的基礎(chǔ)入門資料。2010-04-04

