網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
在學(xué)習(xí)Python3的正則表達(dá)式的時(shí)候遇到一個(gè)例子
#!/usr/bin/python3
import re
line = "Cats are smarter than dogs"
# .* 表示任意匹配除換行符(\n、\r)之外的任何單個(gè)或多個(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!!")
運(yùn)行結(jié)果為
matchObj.group() : ?Cats are smarter than dogs
matchObj.group(1) : ?Cats
matchObj.group(2) : ?smarter
這個(gè)例子主要的理解為r‘(.*) are (.*?) .*’,以下為我查詢資料之后所得到的個(gè)人理解以及試驗(yàn)
- 前面的r比較好理解,表示字符串為非轉(zhuǎn)義的原始字符串,讓編譯器忽略反斜杠,也就是忽略轉(zhuǎn)義字符。但是這個(gè)例子中字符串里沒(méi)有反斜杠,所以這個(gè)r可有可無(wú)。
- (.*) 第一個(gè)匹配分組,.*代表匹配除換行符之外的所有字符
- (.*?)第二個(gè)匹配分組,.*?后面多個(gè)問(wèn)號(hào),代表非貪婪模式,也就是說(shuō)只匹配符合條件的最少字符
- 后面的一個(gè).* ?沒(méi)有括號(hào)包圍,所以不是分組,匹配效果和第一個(gè)一樣,但是不計(jì)入匹配結(jié)果中。
綜上所屬以一種通俗易懂的描述就是將字符串以are為中斷分為幾部分,(.*)因?yàn)槭秦澙返模苑祷氐氖撬袧M足條件的內(nèi)容太,(.*?)為非貪婪模式,所以返回第一個(gè)滿足要求的內(nèi)容或沒(méi)有
匹配成功,這句話如果不好理解就看看下面這個(gè)例子
#!/usr/bin/python3
import re
#line = "Cats are smarter than dogs"
line = "a a Cats are Cats are smarter than dogs"
# .* 表示任意匹配除換行符(\n、\r)之外的任何單個(gè)或多個(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!!")
輸出結(jié)果:
matchObj.group() : ?a a Cats are Cats are smarter than dogs
matchObj.group(1) : ?a a Cats are Cats
matchObj.group(2) : ?smarter than
這個(gè)例子主要是將第一個(gè)例子中的line字符串進(jìn)行了觀察輸出結(jié)果
group(1)對(duì)應(yīng)第一個(gè)括號(hào)的條件,我理解為最后滿足are分段的前面的所有內(nèi)容,如果將第一個(gè)括號(hào)改為(.*?)就是第一個(gè)are的前面內(nèi)容,經(jīng)過(guò)驗(yàn)證確實(shí)是這樣的,這里就不貼程序了可以自行驗(yàn)證
以下示例為更好的解釋第二個(gè)括號(hào)的內(nèi)容以及無(wú)括號(hào)的.*
#!/usr/bin/python3
import re
#line = "Cats are smarter than dogs"
line = "a a Cats are Cats are smarter than dogs"
# .* 表示任意匹配除換行符(\n、\r)之外的任何單個(gè)或多個(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!!")
matchObj.group() : ?a a Cats are Cats are smarter than dogs
matchObj.group(1) : ?a a Cats
matchObj.group(2) : ?Cats are smarter
group(2)對(duì)應(yīng)第二個(gè)括號(hào)的條件:因?yàn)槲覍⑦@里第一個(gè)括號(hào)的內(nèi)容添加了?所以第一個(gè)括號(hào)索引的內(nèi)容就是第一個(gè)are前面的內(nèi)容,第二個(gè)括號(hào)就在當(dāng)前這個(gè)are之后開(kāi)始索引,在這里我沒(méi)有加不加? 所以輸出為輸出后面出去.*條件的所有內(nèi)容
.*因?yàn)闆](méi)有()所以不能使用group訪問(wèn),但是會(huì)實(shí)際占用位置,上面例子最后使用了兩個(gè).* 所以最后占用兩個(gè)單詞,那么前面的內(nèi)容就是group(2)的輸出內(nèi)容了
可以自己嘗試一個(gè)多加幾個(gè) are在語(yǔ)句中 然后判斷語(yǔ)句修改有無(wú)?或者括號(hào)進(jìn)行觀察效果
#!/usr/bin/python3
import re
#line = "Cats are smarter than dogs"
line = "a a Cats are CatsB are smarter are than are dogs are dogs b c d e"
# .* 表示任意匹配除換行符(\n、\r)之外的任何單個(gè)或多個(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))
print ("matchObj.group(3) : ", matchObj.group(3))
print ("matchObj.group(4) : ", matchObj.group(4))
else:
print ("No match!!")
matchObj.group() : ?a a Cats are CatsB are smarter are than are dogs are dogs b c d e
matchObj.group(1) : ?a a Cats
matchObj.group(2) : ?CatsB
matchObj.group(3) : ?are
matchObj.group(4) : ?smarter are than are dogs are dogs b c d
總結(jié)
原文鏈接:https://blog.csdn.net/linng12/article/details/121614878
相關(guān)推薦
- 2022-10-16 Python實(shí)現(xiàn)自定義Jupyter魔法命令_python
- 2022-07-18 數(shù)據(jù)結(jié)構(gòu) III 深入理解棧和隊(duì)列實(shí)現(xiàn)
- 2022-08-13 Linux管理員root密碼忘記了怎么辦?
- 2022-11-20 Python利用pangu模塊實(shí)現(xiàn)文本格式化小工具_(dá)python
- 2021-12-15 詳談浮點(diǎn)精度(float、double)運(yùn)算不精確的原因_C 語(yǔ)言
- 2023-02-17 python連接讀寫操作redis的完整代碼實(shí)例_python
- 2022-03-12 Android列表點(diǎn)擊事件定義的一些思考_Android
- 2023-01-03 Redis實(shí)現(xiàn)優(yōu)惠券限一單限制詳解_Redis
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支