這個問題在這里已經有了答案: 正則運算式包括結果中應該是非捕獲組的內容 3 個回答 什么是正則運算式中的非捕獲組? (17 個回答) 昨天關閉。
考慮以下正則運算式:
(. ?($|/))
這是我從這個問題的實際正則運算式中分離出來的部分
^post/(?!\d ($|/))(. ?($|/))(\d )?
這匹配諸如post/1234x/2or 之類的東西post/1234x,但不匹配post/1234. 我碰巧抓住$2和$4我的htaccess的重定向。
$2 => (. ?($|/))
$4 => (\d $)
這$2是給我的1234x/,但我需要它沒有斜線。我想出了一種解決方案來(. ?)($|/)代替(. ?($|/)). 這樣,我得到1234x了$2就不加斜杠。出于好奇,我試過:
(. ?(?:$|/))
思考?:會創建一個非捕獲組,我認為$2不會包括(?:$|/)并且只是像(. ?),但事實并非如此。
那么有沒有辦法?:排除組($2)的部分(子組)?例如(whatever(exclude_me))?
uj5u.com熱心網友回復:
我使用了一個非捕獲組和第二組來獲取下一個數字和字符選項模式,并使用第三組來獲取斜杠數字模式
txt="""post/1234x/2
post/1234x
post/1234"""
pattern=r'(?:post)(\/\d ?\w*)(\/\d*)*'
matches=re.findall(pattern,txt)
for match in matches:
print(match)
輸出
('/1234x', '/2')
('/1234x', '')
('/1234', '')
uj5u.com熱心網友回復:
您已經注意到預期的行為,即您的非捕獲是外部捕獲組的一部分,因此非捕獲組的內容也包含在外部捕獲組中。非捕獲組只會導致該組不是所有捕獲組的一部分。它不會從它所屬的另一個捕獲組中洗掉或排除它的內容。
我建議為您的規則使用更強大的正則運算式:
^post/(?!\d (?:$|/))([^/] )(?:/(\d ))?(?:/|$)
正則運算式演示
在這里,第一個捕獲組是([^/] )匹配 1 的任何不是/.
它后面是一個可選的非捕獲組,該組以/后面的 1 數字開頭,它在組 #2 中被捕獲。
建議的重寫規則:
RewriteRule ^post/(?!\d (?:$|/))([^/] )(?:/(\d ))?(?:/|$) post.php?title=$1&repeat=$2 [L,QSA,NC]
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/401850.html
上一篇:Powershell和正則運算式從檔案中提取多個資料點
下一篇:從正則運算式組中排除一些字符
