2015-10-26 67 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

相关问题