2015-10-26 108 views
4

我有一個python代碼,我正在讀取證書並僅匹配根證書。對於我的證書如下:python正則表達式只匹配第一個實例

--------begin certificate-------- 
CZImiZPyLGQBGRYFbG9jYWwxGjAYBgoJkiaJk/IasdasdassZAEZFgp2aXJ0dWFsdnB4MSEw 
HwYDVQQDExh2aXJ0dWFsdnB4LVZJUlRVQUxEQzEtQ0EwHhfdgdgdgfcNMTUwOTE2MTg1MTMx 
WhcNMTcwOTE2MTkwMTMxWjBaMQswCQYDVQQGEwJVUzEXMBUGCgmSJoaeqasadsmT8ixkARkW 
B3ZzcGhlcmUxFTATBgoJkiaJk/IsZAEZFgVsb2NhbDEOMAwGA1UEChMFdmNlcnfrrfgfdvQx 
CzAJBgNVBAMTAkNBMIIBIjANBgkqhkiG9w 
--------end certificate---------- 
--------begin certificate-------- 
ZGFwOi8vL0NOPXZpcnR1YWx2cHgtcvxcvxvVklSVFVBTERDMS1DQSxDTj1BSUEsQ049UHVi 
bGljJTIwS2V5JTIwU2VydmldfsfhjZXMsQ049U2VydmfffljZXMsQ049Q29uZmlndXJhdGlv 
bixEQz12aXJ0dWFsdnB4LERDPWxvY2FsP2NxvxcvxcvBQ2VydGlmaWNhdGU/YmFzZT9vYmpl 
Y3RDbGFzcz1jZXJ0aWZpY2F0aW9uQXV0dsfsdffraG9yaXR5MD0GCSsGAQQBgjcVBwQwMC4G 
--------end certificate---------- 

我想只提取以CZImiZPy開頭的根證書。我讀了證書導入到可變數據和應用正則表達式如下

re.sub('-----.*?-----', '', data) 

但它獲取將加密證書,不只是第一個。有沒有更好的方法可以調整正則表達式?

+0

你還可以提供預期的輸出? –

+0

@emre。預期的輸出是那裏,只是第一個'<加密的證書>' – yzT

+0

@yzT:如果這是OP想要的話,那麼他不應該在這裏使用're.sub()'。 –

回答

2

您想搜索文本,而不是用別的東西替代它。

>>> import re 
>>> s = """--------begin certificate-------- 
<certificate encrypted> 
--------end certificate---------- 
--------begin certificate-------- 
<certificate encrypted> 
--------end certificate----------""" 
>>> re.search(r"-+begin certificate-+\s+(.*?)\s+-+end certificate-+", s, flags=re.DOTALL).group(1) 
'<certificate encrypted>' 

說明:

-+begin certificate-+ # Match the starting label 
\s+     # Match whitespace (including linebreaks) 
(.*?)     # Match any number of any character. Capture the result in group 1 
\s+     # Match whitespace (including linebreaks) 
-+end certificate-+ # Match the ending label 

re.search()總是會返回第一個匹配。

+0

這沒有給出正確的輸出。它打印: ================================ RESTART ============= =================== – Sandy

+0

@Sandy:我看不到你在問題中給出的樣本中的文字。正則表達式適用於該輸入 - 如果它不適用於「真實世界」數據,則需要指定數據的實際外觀,否則對有用正則表達式的所有嘗試都將註定失敗... –

+0

更新了數據和問題 – Sandy

5
​​

可以得到一個計數變量作爲參數:

re.sub(pattern, repl, string, count=0, flags=0)

可選參數count要被替換圖案出現的最大數目..

如果您只想更改第一個匹配項,請執行以下操作:

re.sub('-----.*?-----', '', data, 1) 

需要注意的是,如果你想提取,則不應使用re.sub。訪問re模塊,瞭解幫助您從字符串中提取模式的所有可用函數。

+1

儘管如此,這對OP的(XY)問題沒有任何正面影響。減少替換次數意味着更多的待丟棄文本仍然存在。 –

+0

@TimPietzcker這就是爲什麼我提到最後一部分。我只回答OP的問題「正則表達式只匹配一次」。他使用'sub',它接受count參數。 – Maroun

+0

@TimPietzcker你的答案只是我答案的最後一部分的實現:)我只是不想給OP一個現成的解決方案。來自他的最小嚐試可能會幫助他更多。 – Maroun

相關問題