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