欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python使用正則匹配判斷字符串中含有某些特定子串及正則表達式詳解

 更新時間:2023年12月23日 11:11:54   作者:小白想聽人話  
這篇文章主要介紹了python使用正則匹配判斷字符串中含有某些特定子串?及?正則表達式詳解,需要的朋友可以參考下

一、判斷字符串中是否含有字串

1. innot 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不能識別\nre.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,而不是Unicodere.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-zA-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\bnever (√),verb(×)
\B匹配非單詞邊界er\bnever (×),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}cabc 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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論