python正则表达式只匹配第一个实例

时间:2015-10-26 08:29:43

标签: python regex

我有一个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)

但是它获取了加密的证书,而不仅仅是第一个。有没有更好的方法可以调整正则表达式?

2 个答案:

答案 0 :(得分:6)

re.sub可以将计数变量作为参数:

  

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

     

可选参数count要替换的模式最大出现次数 ..

如果您只想更改第一场比赛,请执行以下操作:

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

请注意,如果您要提取,则不应使用re.sub。访问re模块,了解可帮助您从字符串中提取模式的所有可用函数。

答案 1 :(得分: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()将始终返回第一场比赛。