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

python正则表达式仅匹配第一个实例,python,regex,Python,Regex,我有一个python代码,我正在读取一个证书,并且只匹配根证书。对于ex,我的证书如下所示: --------begin certificate-------- CZImiZPyLGQBGRYFbG9jYWwxGjAYBgoJkiaJk/IasdasdassZAEZFgp2aXJ0dWFsdnB4MSEw HwYDVQQDExh2aXJ0dWFsdnB4LVZJUlRVQUxEQzEtQ0EwHhfdgdgdgfcNMTUwOTE2MTg1MTMx WhcNMTcwOTE2MTkwMTMxWjB

我有一个python代码,我正在读取一个证书,并且只匹配根证书。对于ex,我的证书如下所示:

--------begin certificate--------
CZImiZPyLGQBGRYFbG9jYWwxGjAYBgoJkiaJk/IasdasdassZAEZFgp2aXJ0dWFsdnB4MSEw
HwYDVQQDExh2aXJ0dWFsdnB4LVZJUlRVQUxEQzEtQ0EwHhfdgdgdgfcNMTUwOTE2MTg1MTMx
WhcNMTcwOTE2MTkwMTMxWjBaMQswCQYDVQQGEwJVUzEXMBUGCgmSJoaeqasadsmT8ixkARkW
B3ZzcGhlcmUxFTATBgoJkiaJk/IsZAEZFgVsb2NhbDEOMAwGA1UEChMFdmNlcnfrrfgfdvQx
CzAJBgNVBAMTAkNBMIIBIjANBgkqhkiG9w
--------end certificate----------
--------begin certificate--------
ZGFwOi8vL0NOPXZpcnR1YWx2cHgtcvxcvxvVklSVFVBTERDMS1DQSxDTj1BSUEsQ049UHVi
bGljJTIwS2V5JTIwU2VydmldfsfhjZXMsQ049U2VydmfffljZXMsQ049Q29uZmlndXJhdGlv
bixEQz12aXJ0dWFsdnB4LERDPWxvY2FsP2NxvxcvxcvBQ2VydGlmaWNhdGU/YmFzZT9vYmpl
Y3RDbGFzcz1jZXJ0aWZpY2F0aW9uQXV0dsfsdffraG9yaXR5MD0GCSsGAQQBgjcVBwQwMC4G
--------end certificate----------
我只想获取根证书,它以CZImiZPy开头。我将证书读入变量数据并应用下面的正则表达式

re.sub('-----.*?-----', '', data)
但它同时获取了加密证书,而不仅仅是第一个。有没有更好的方法可以调整正则表达式?

可以获得一个计数变量作为参数:

re.sub(模式、应答、字符串、计数=0、标志=0)

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

如果只想更改第一个匹配项,请执行以下操作:

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

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

您希望搜索文本,而不是将其替换为其他内容

>>> 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>'

re.search()
将始终返回第一个匹配项。

您是否也可以提供预期的输出?@emre。预期的输出就在那里,只有第一个
@yzT:如果这是OP想要的,那么他不应该在这里使用
re.sub()
。虽然这是真的,但对OP的(XY)问题没有任何积极影响。减少替换的数量意味着需要丢弃的文本会保留更多。@TimPietzcker这就是我提到最后一部分的原因。我刚才回答了OP的问题“regex只匹配第一个实例”。他正在使用
sub
,它接受count参数。@TimPietzcker你的答案只是我答案最后一部分的实现:)我只是不想给OP一个现成的解决方案。他稍微试一下可能会对他帮助更大。整个答案(除了最后一段,应该是评论)是误导性的。他正在寻找第一场比赛,他希望通过移除所有的非比赛来获得它。您的解决方案向他展示了如何仅删除第一个不匹配项。这对他/她没有帮助。@Maroun/kevin:我不想改变任何事情。我只想打印第一张。您提到的更改对我不起作用。这不会给出正确的输出。它打印出来:=============================================================================================================@Sandy:我看不到您在问题中给出的示例中的文本。正则表达式适用于该输入-如果它不适用于“真实世界”数据,则需要指定数据的实际外观,否则所有尝试使用正则表达式的操作都将失败…更新数据并question@Sandy:正则表达式仍然有效,文本仍然不包含
===RESTART===
。是否确实正确使用了
re.search()
?您是否正在分配或打印结果(即,
print re.search(…)
result=re.search(…);print result
)?谢谢!它现在正在工作。我的语法错误。