我正在學習正則運算式,我想從具有以下特征的文本中提取字串:
- 它總是以
C小寫或大寫字母開頭,然后是一些十六進制字符(這意味著它可以包含A to F來自 的字母和數字1 to 9,不包括零)。 - 在這些十六進制字符之后是一個字母
P,也可以是小寫或大寫 - 然后是更多的十六進制字符(同樣,不包括 0)。
這意味著我想捕獲字母之間的字串以及字母C之后P的字串P并將它們連接成一個字串,同時丟棄字母C和P
有效字串的示例是:
c45AFP2
CAPF
c56Bp26
CA6C22pAAA
對于上述示例,我想要以相同的順序提取以下內容:
45AF2 # Original string: c45AFP2
AF # Original string: CAPF
56B26 # Original string: c56Bp26
A6C22AAA # Original string: CA6C22pAAA
無效字串的示例是:
BCA6C22pAAA # It doesn't begin with C
c56Bp # There aren't any characters after P
c45AF0P2 # Contains a zero
C我正在使用python,我想要一個正則運算式來提取字符之間P以及之后的兩個字串P
到目前為止,我想出了這個:
(?<=\A[cC])[a-fA-F1-9]*(?<=[pP])[a-fA-F1-9]*
細分將是:
(?<=\A[cC])積極的后向斷言。斷言正則運算式決議器當前位置之前的內容必須匹配[cC],并且 [cC] 必須在字串的開頭
[a-fA-F1-9]*匹配串列中的單個字符,次數介于零次和無限次之間
(?<=[pP])積極的后向斷言。斷言正則運算式決議器當前位置之前的內容必須匹配[pP]
[a-fA-F1-9]*匹配串列中的單個字符,次數介于零次和無限次之間
但是使用上面的正則運算式我無法匹配任何字串!
|當我在兩者之間(?<=[cC])[a-fA-F1-9]*插入一個(?<=[pP])[a-fA-F1-9]*它就可以了。
意味著以下正則運算式有效:
(?<=[cC])[a-fA-F1-9]*|(?<=[pP])[a-fA-F1-9]*
我知道這|意味著它應該最多匹配一個指定的正則運算式。但它不是貪婪的,它會回傳它找到的第一個匹配項。剩下的運算式沒有經過測驗,對吧?
但是 using|意味著字串BCA6C22pAAA是部分匹配的,AAA因為它出現在 之后P,即使第一個斷言不正確,因為它不是以 a 開頭C。
不應該是這樣的。我希望它只有在開頭解釋的所有條件都為真時才匹配。
有人可以向我解釋為什么我的第一次嘗試沒有產生我想要的結果嗎?另外,我怎樣才能改進我的正則運算式?
我仍然需要它:
- 如果字串包含數字 0,則不匹配
- 僅在滿足所有條件時才匹配
謝謝
uj5u.com熱心網友回復:
匹配之前和之后的兩個組P或p
(?<=^[Cc])[1-9a-fA-F] (?=[Pp]([1-9a-fA-F] $))
(?<=^[Cc])- 積極的向后看。必須匹配不區分大小寫C或c在行首[1-9a-fA-F]- 匹配十六進制字符一次或多次(?=[Pp]- 不區分大小寫的正向前瞻p或P([1-9a-fA-F] $)-觀看演示后的一個或多個十六進制字符的 Cature 組pP
uj5u.com熱心網友回復:
您的主要問題是您正在(?<=[pP])為前面的事情使用向后看,這永遠不會奏效:您需要向前看 (?=...)。
此外,最后的量詞不應該是*因為在 . 之后至少需要一個尾隨字符p。
最后一個錯誤是你沒有捕捉到任何東西,你只是在匹配,所以把你想要捕捉的東西放在括號內,這也意味著你可以洗掉所有的環視。
如果您使用不區分大小寫的標志,它會使正則運算式更小且更易于閱讀。
捕獲第 1 組和第 2 組中的 2 個十六進制部分的作業正則運算式是:
(?i)^c([a-f1-9]*)p([a-f1-9] )
見現場演示。
除非您需要使用\A,否則更喜歡^(輸入開始)而不是\A(多行場景中所有輸入的開始),因為^更易于閱讀并且\A不會匹配每一行,這是許多情況和工具所期望的。我用過^。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/483128.html
上一篇:Bash正則運算式從特定字符的第二次出現直到行尾提取所有文本
下一篇:決議檔案中的多個json類物件
