Python 如果从文件中读取字符串,则正则表达式不起作用

Python 如果从文件中读取字符串,则正则表达式不起作用,python,regex,Python,Regex,我有一个名为foo的文件,其中包含以下文本 <ca> -----BEGIN CERTIFICATE----- MIIB6DCCAVECBCMBFpQwDQYJKoZIhvcNAQEFBQAwOzEPMA0GA1UEAxMGbGZ0Lmpw MRswGQYDVQQKExJ1N2FoMzZpN24wYSBsejFpZzUxCzAJBgNVBAYTAlVTMB4XDTEz MTIwNzE5MjkxNVoXDTIxMDMyMTE5MjkxNVowOzEPMA0GA1UEAxMGbGZ0Lmp

我有一个名为
foo
的文件,其中包含以下文本

<ca>
-----BEGIN CERTIFICATE-----
MIIB6DCCAVECBCMBFpQwDQYJKoZIhvcNAQEFBQAwOzEPMA0GA1UEAxMGbGZ0Lmpw
MRswGQYDVQQKExJ1N2FoMzZpN24wYSBsejFpZzUxCzAJBgNVBAYTAlVTMB4XDTEz
MTIwNzE5MjkxNVoXDTIxMDMyMTE5MjkxNVowOzEPMA0GA1UEAxMGbGZ0LmpwMRsw
GQYDVQQKExJ1N2FoMzZpN24wYSBsejFpZzUxCzAJBgNVBAYTAlVTMIGfMA0GCSqG
SIb3DQEBAQUAA4GNADCBiQKBgQDKEcE9hTtJk/XmOpISG33ADHGpS+fzxjun7N3/
Nqj43JC9EIHazLE2UKVHaajgcGYUDGkTTcGCATWRtKuWJKmE57msEp0qCHv8WxI/
HV5OhW2LT5BD48ImZRnlPqtnclcgmYbvdeg7oPBcgXZ14mIqTVOA/bkoxc8ZI7/W
4TXU9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAAa7HCk24EXNjjEAKTr5/MysFSZd
DVJbVc+QpThDrEAj6OzCteLXGiSYhtDi4EXeyJORifau+UYLihuy2BU3TooWDKIZ
4+grA2XGe7+N+d02mbLbMnloVyrqslweMy9muQUzjbH7gvtQj9X0ZvIWcTJCvhwX
y+sh9N42+sqJTLu3
-----END CERTIFICATE-----

</ca>



<cert>
-----BEGIN CERTIFICATE-----
MIICxjCCAa4CAQAwDQYJKoZIhvcNAQEFBQAwKTEaMBgGA1UEAxMRVlBOR2F0ZUNs
aWVudENlcnQxCzAJBgNVBAYTAkpQMB4XDTEzMDIxMTAzNDk0OVoXDTM3MDExOTAz
MTQwN1owKTEaMBgGA1UEAxMRVlBOR2F0ZUNsaWVudENlcnQxCzAJBgNVBAYTAkpQ
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5h2lgQQYUjwoKYJbzVZA
5VcIGd5otPc/qZRMt0KItCFA0s9RwReNVa9fDRFLRBhcITOlv3FBcW3E8h1Us7RD
4W8GmJe8zapJnLsD39OSMRCzZJnczW4OCH1PZRZWKqDtjlNca9AF8a65jTmlDxCQ
CjntLIWk5OLLVkFt9/tScc1GDtci55ofhaNAYMPiH7V8+1g66pGHXAoWK6AQVH67
XCKJnGB5nlQ+HsMYPV/O49Ld91ZN/2tHkcaLLyNtywxVPRSsRh480jju0fcCsv6h
p/0yXnTB//mWutBGpdUlIbwiITbAmrsbYnjigRvnPqX1RNJUbi9Fp6C2c/HIFJGD
ywIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQChO5hgcw/4oWfoEFLu9kBa1B//kxH8
hQkChVNn8BRC7Y0URQitPl3DKEed9URBDdg2KOAz77bb6ENPiliD+a38UJHIRMqe
UBHhllOHIzvDhHFbaovALBQceeBzdkQxsKQESKmQmR832950UCovoyRB61UyAV7h
+mZhYPGRKXKSJI6s0Egg/Cri+Cwk4bjJfrb5hVse11yh4D9MHhwSfCOH+0z4hPUT
Fku7dGavURO5SVxMn/sL6En5D+oSeXkadHpDs+Airym2YHh15h0+jPSOoR6yiVp/
6zZeZkrN43kuS73KpKDFjfFPh8t4r1gOIjttkNcQqBccusnplQ7HJpsk
-----END CERTIFICATE-----

</cert>




<key>
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA5h2lgQQYUjwoKYJbzVZA5VcIGd5otPc/qZRMt0KItCFA0s9R
wReNVa9fDRFLRBhcITOlv3FBcW3E8h1Us7RD4W8GmJe8zapJnLsD39OSMRCzZJnc
zW4OCH1PZRZWKqDtjlNca9AF8a65jTmlDxCQCjntLIWk5OLLVkFt9/tScc1GDtci
55ofhaNAYMPiH7V8+1g66pGHXAoWK6AQVH67XCKJnGB5nlQ+HsMYPV/O49Ld91ZN
/2tHkcaLLyNtywxVPRSsRh480jju0fcCsv6hp/0yXnTB//mWutBGpdUlIbwiITbA
mrsbYnjigRvnPqX1RNJUbi9Fp6C2c/HIFJGDywIDAQABAoIBAERV7X5AvxA8uRiK
k8SIpsD0dX1pJOMIwakUVyvc4EfN0DhKRNb4rYoSiEGTLyzLpyBc/A28Dlkm5eOY
fjzXfYkGtYi/Ftxkg3O9vcrMQ4+6i+uGHaIL2rL+s4MrfO8v1xv6+Wky33EEGCou
QiwVGRFQXnRoQ62NBCFbUNLhmXwdj1akZzLU4p5R4zA3QhdxwEIatVLt0+7owLQ3
lP8sfXhppPOXjTqMD4QkYwzPAa8/zF7acn4kryrUP7Q6PAfd0zEVqNy9ZCZ9ffho
zXedFj486IFoc5gnTp2N6jsnVj4LCGIhlVHlYGozKKFqJcQVGsHCqq1oz2zjW6LS
oRYIHgECgYEA8zZrkCwNYSXJuODJ3m/hOLVxcxgJuwXoiErWd0E42vPanjjVMhnt
KY5l8qGMJ6FhK9LYx2qCrf/E0XtUAZ2wVq3ORTyGnsMWre9tLYs55X+ZN10Tc75z
4hacbU0hqKN1HiDmsMRY3/2NaZHoy7MKnwJJBaG48l9CCTlVwMHocIECgYEA8jby
dGjxTH+6XHWNizb5SRbZxAnyEeJeRwTMh0gGzwGPpH/sZYGzyu0SySXWCnZh3Rgq
5uLlNxtrXrljZlyi2nQdQgsq2YrWUs0+zgU+22uQsZpSAftmhVrtvet6MjVjbByY
DADciEVUdJYIXk+qnFUJyeroLIkTj7WYKZ6RjksCgYBoCFIwRDeg42oK89RFmnOr
LymNAq4+2oMhsWlVb4ejWIWeAk9nc+GXUfrXszRhS01mUnU5r5ygUvRcarV/T3U7
TnMZ+I7Y4DgWRIDd51znhxIBtYV5j/C/t85HjqOkH+8b6RTkbchaX3mau7fpUfds
Fq0nhIq42fhEO8srfYYwgQKBgQCyhi1N/8taRwpk+3/IDEzQwjbfdzUkWWSDk9Xs
H/pkuRHWfTMP3flWqEYgW/LW40peW2HDq5imdV8+AgZxe/XMbaji9Lgwf1RY005n
KxaZQz7yqHupWlLGF68DPHxkZVVSagDnV/sztWX6SFsCqFVnxIXifXGC4cW5Nm9g
va8q4QKBgQCEhLVeUfdwKvkZ94g/GFz731Z2hrdVhgMZaU/u6t0V95+YezPNCQZB
wmE9Mmlbq1emDeROivjCfoGhR3kZXW1pTKlLh6ZMUQUOpptdXva8XxfoqQwa3enA
M7muBbF0XN7VO80iJPv+PmIZdEIAkpwKfi201YB+BafCIuGxIF50Vg==
-----END RSA PRIVATE KEY-----

</key>

为什么读取文件无效?

我认为您的函数读取文件时出错。注意“rb”标志。应该是这样的:

def read_file(name):
    f = open(name, 'rb')
    return f.read()

f = read_file('foo')

您需要调整正则表达式:

>>> with open('test.txt') as f:
...    lines = f.read()
...
>>> re.findall('<ca>(.*?)</ca>', lines, re.DOTALL)[0]
'\n-----BEGIN CERTIFICATE-----\nMIIB6DCCAV[...]u3\n-----END CERTIFICATE-----\n\n'
以open('test.txt')作为f: ... 行=f.read() ... >>>关于findall(“(.*?”,行,关于DOTALL)[0] “\n-----开始证书------\nMIIB6DCCAV[…]u3\n-----结束证书------\n\n” 试试这个:

m = re.search('<ca>(.+?)</ca>', f, re.DOTALL)
m=re.search(“(.+?)”,f,re.DOTALL)


m=re.search(”((?:[^你太天真了。不要公开发布私钥。啊,不。有伪密钥:)@gaggina听到这个很高兴哈哈。你的代码在我的机器上运行得很好,你的
foo
是否与你的python文件在同一个目录下?当然。foo文件在正确的目录中它看起来是一个文本文件,所以
rb
将是一个错误的选择。但是你将整个文件读入变量的方式比你的第一个例子很好用。你能解释一下为什么m=re.search(“(^.+$)”,f,re.MULTILINE | re.DOTALL)不起作用吗?
>>> with open('test.txt') as f:
...    lines = f.read()
...
>>> re.findall('<ca>(.*?)</ca>', lines, re.DOTALL)[0]
'\n-----BEGIN CERTIFICATE-----\nMIIB6DCCAV[...]u3\n-----END CERTIFICATE-----\n\n'
m = re.search('<ca>(.+?)</ca>', f, re.DOTALL)
m = re.search('<ca>((?:[^<]+|<+(?!/ca>))+)</ca>', f)