
正則運算式的題目
請教,答案是多少?
為什么是這個答案?
uj5u.com熱心網友回復:
我心中的答案是com可惜選擇項里沒有啊
uj5u.com熱心網友回復:
ifcode.comuj5u.com熱心網友回復:
完整匹配 0-14 www.ifcode.com分組 1. 0-14 www.ifcode.com
分組 2. 0-3 www
分組 3. 4-14 ifcode.com
分組 4. 4-10 ifcode
分組 5. 11-14 com
選擇: A
uj5u.com熱心網友回復:
簡答:選 A = ifcode.com詳解:
((www).((ifcode).(com)))
|__________ 0 _________| 0 默認是匹配整個的,完整的,所有的 字串
從左向右數是第幾個左括號:
|__________ 1 _________| 第一個括號 就是 group(1)
|_2_| |______ 3 _____| 第2個括號 和 第3個 括號的范圍,分別如左邊所示
|___4__| |_5_| 第4個括號 和 第5個 括號的范圍,分別如左邊所示
-> 所以此處的 group(3) 對應著:
((ifcode).(com))
的部分,即:
ifcode.com
另外也可借助工具看的更清楚:
RegExr: Learn, Build, & Test RegEx

點評:
出題者這么出,是想考你:
(1)是否知道 默認的 group(0),始終表示是 全部匹配的結果,或者說 是否知道 group(0) 的存在
(2)考察你 group的計算規則,其實就是 從左向右右數,最低是1,每一個左括號 ( 就對應著該group的編號
深度評價:
其實,上圖這種寫法,是不好的寫法
應該用name group 去寫,邏輯更清楚
完整代碼如下:
import re
inputDomainStr = "www.crifan.com"
domainP = "(?P<wholeDomain>(?P<subDomain>www).(?P<hostOrg>(?P<host>crifan).(?P<org>com)))"
foundDomain = re.search(domainP, inputDomainStr)
if foundDomain:
wholeMatchStr = foundDomain.group(0)
print("wholeMatchStr=%s" % wholeMatchStr)
wholeDomain = foundDomain.group("wholeDomain")
print("wholeDomain=%s" % wholeDomain)
subDomain = foundDomain.group("subDomain")
print("subDomain=%s" % subDomain)
hostOrg = foundDomain.group("hostOrg")
print("hostOrg=%s" % hostOrg)
host = foundDomain.group("host")
print("host=%s" % host)
org = foundDomain.group("org")
print("org=%s" % org)
# wholeMatchStr=www.crifan.com
# wholeDomain=www.crifan.com
# subDomain=www
# hostOrg=crifan.com
# host=crifan
# org=com
print("="*80)
進一步的優化:
(1)點
上面的點 . 其實是能匹配到任意字符,而不僅僅是 點 本身,而此處本意是 只匹配點本身,所以應該優化為 \.
(2)匹配更多域名
如果要匹配其他更多域名,比如:
book.crifan.com
www.crifan.org
等情況,則可以用如下代碼:
InputDomainList = [
"www.crifan.com",
"book.crifan.com",
"wiki.crifan.com",
"www.crifan.net",
"www.crifan.org",
]
for curIdx, eachDomainStr in enumerate(InputDomainList):
print("%s %s %s" % ("-"*20, curIdx, "-"*20))
print("eachDomainStr=%s" % eachDomainStr)
multiDomainP = "(?P<wholeDomain>(?P<subDomain>\w+).(?P<hostOrg>(?P<host>\w+).(?P<org>\w+)))"
foundMultiDomain = re.search(multiDomainP, eachDomainStr)
if foundMultiDomain:
curWholeMatchStr = foundMultiDomain.group(0)
print("curWholeMatchStr=%s" % curWholeMatchStr)
curWholeDomain = foundMultiDomain.group("wholeDomain")
print("curWholeDomain=%s" % curWholeDomain)
curSubDomain = foundMultiDomain.group("subDomain")
print("curSubDomain=%s" % curSubDomain)
curHostOrg = foundMultiDomain.group("hostOrg")
print("curHostOrg=%s" % curHostOrg)
curHost = foundMultiDomain.group("host")
print("curHost=%s" % curHost)
curOrg = foundMultiDomain.group("org")
print("curOrg=%s" % curOrg)
# -------------------- 0 --------------------
# eachDomainStr=www.crifan.com
# curWholeMatchStr=www.crifan.com
# curWholeDomain=www.crifan.com
# curSubDomain=www
# curHostOrg=crifan.com
# curHost=crifan
# curOrg=com
# -------------------- 1 --------------------
# eachDomainStr=book.crifan.com
# curWholeMatchStr=book.crifan.com
# curWholeDomain=book.crifan.com
# curSubDomain=book
# curHostOrg=crifan.com
# curHost=crifan
# curOrg=com
# -------------------- 2 --------------------
# eachDomainStr=wiki.crifan.com
# curWholeMatchStr=wiki.crifan.com
# curWholeDomain=wiki.crifan.com
# curSubDomain=wiki
# curHostOrg=crifan.com
# curHost=crifan
# curOrg=com
# -------------------- 3 --------------------
# eachDomainStr=www.crifan.net
# curWholeMatchStr=www.crifan.net
# curWholeDomain=www.crifan.net
# curSubDomain=www
# curHostOrg=crifan.net
# curHost=crifan
# curOrg=net
# -------------------- 4 --------------------
# eachDomainStr=www.crifan.org
# curWholeMatchStr=www.crifan.org
# curWholeDomain=www.crifan.org
# curSubDomain=www
# curHostOrg=crifan.org
# curHost=crifan
# curOrg=org
附錄,我寫的教程,你可以看看:
1.關于正則本身的
應用廣泛的超強搜索:正則運算式
2.關于python的正則re的:
Python中正則運算式:re模塊詳解
uj5u.com熱心網友回復:
筆誤,上面后續優化代碼中,應該寫成 反斜杠 加 點:\.multiDomainP = "(?P<wholeDomain>(?P<subDomain>\w+)\.(?P<hostOrg>(?P<host>\w+)\.(?P<org>\w+)))"
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/235109.html
下一篇:python求解答案
