[英]Python re.search function regex issue
I have the following code: 我有以下代码:
#!/usr/bin/python
import time, uuid, hmac, hashlib, base64, json
import urllib3
import certifi
import datetime
import requests
import re
from datetime import datetime
http = urllib3.PoolManager(
cert_reqs='CERT_REQUIRED', # Force certificate check.
ca_certs=certifi.where(), # Path to the Certifi bundle.
)
#Get the status response from pritunl api
BASE_URL = 'https://www.vpn.trimble.cloud:443'
API_TOKEN = 'gvwrfQZQPryTbX3l03AQMwTyaE0aFywE'
API_SECRET = 'B0vZp5dDyOrshW1pmFFjAnIUyeGtFy9y'
LOG_PATH = '/var/log/developer_vpn/'
def auth_request(method, path, headers=None, data=None):
auth_timestamp = str(int(time.time()))
auth_nonce = uuid.uuid4().hex
auth_string = '&'.join([API_TOKEN, auth_timestamp, auth_nonce,
method.upper(), path] + ([data] if data else []))
auth_signature = base64.b64encode(hmac.new(
API_SECRET, auth_string, hashlib.sha256).digest())
auth_headers = {
'Auth-Token': API_TOKEN,
'Auth-Timestamp': auth_timestamp,
'Auth-Nonce': auth_nonce,
'Auth-Signature': auth_signature,
}
if headers:
auth_headers.update(headers)
return http.request(method, BASE_URL + path, headers=auth_headers, body=data)
response1 = auth_request('GET',
'/server',
)
if response1.status == 200:
pritunlServResponse = (json.loads(response1.data))
#print pritunlServResponse
#print response1.data
Name = [y['name'] for y in pritunlServResponse]
Server_id = [x['id'] for x in pritunlServResponse]
for srv_name, srv_id in zip(Name, Server_id):
response2 = auth_request('GET',
'/server/' + srv_id + '/output',
)
pritunlServResponse2 = (json.loads(response2.data))
py_pritunlServResponse2 = pritunlServResponse2['output']
print("value of srv_id: ", srv_id, "\n")
print("value of srv_name: ", srv_name, "\n")
logfile = open(LOG_PATH + srv_name +'_vpn_out.log', 'w')
for log in py_pritunlServResponse2:
if re.search(r'(?!52\.39\.62\.8)', log):
logfile.write("%s\n" % log)
logfile.close()
else:
raise SystemExit
This code visits a website using authentication (the address has been redacted), grabs some text formatted in JSON, and parses two values from the output: "srv_name" and "srv_id". 此代码使用身份验证访问网站(地址已被编辑),获取一些以JSON格式设置的文本,并从输出中解析两个值:“ srv_name”和“ srv_id”。 This code then uses the "srv_id" to construct additional HTTP requests to get log files from the server.
然后,此代码使用“ srv_id”构造其他HTTP请求,以从服务器获取日志文件。 It then grabs the log files - one for each "srv_id" and names them with the values obtained from "srv_name" and saves them on the local system.
然后,它获取日志文件-每个“ srv_id”一个,并使用从“ srv_name”获得的值命名它们,并将其保存在本地系统上。
I want to do some additional grep-style processing before the files are written to the local system. 我想在将文件写入本地系统之前进行一些其他的grep样式处理。 Specifically I'd like to exclude any text exactly containing "52.39.62.8" from being written.
具体来说,我想排除任何包含“ 52.39.62.8”的文本。 When I run the code above, it looks like the regex is not being processed as I still see "52.39.62.8" in my output files.
当我运行上面的代码时,正则表达式似乎没有得到处理,因为我在输出文件中仍然看到“ 52.39.62.8”。
If the IP address is always flanked by specific characters, eg: (52.39.62.8):
, you can use in
for exact contains: 如果IP地址的两侧始终
(52.39.62.8):
特定字符,例如: (52.39.62.8):
可以使用in
来包含确切的内容:
if '(52.39.62.8):' not in log:
logfile.write(log + '\n')
re.search(r'(?!52\.39\.62\.8)', log)
You're matching any empty string that is not followed by the ip address - every string will match, as this will match the end of any string. 您正在匹配没有IP地址的任何空字符串-每个字符串都将匹配,因为它将匹配任何字符串的结尾。
reverse your logic and output the line to the log only if re.search
for the ip address comes back as None
. 反转逻辑,仅在
re.search
ip地址返回为None
时才将行输出到日志。
if re.search(r'(?<!\d)52\.39\.62\.8(?!\d)', log) is None:
logfile.write("%s\n" % log)
note that this also includes it's own negative look-behind and look-ahead assertions to ensure no digits precede or follow the ip address. 请注意,这还包括它自己的否定式前瞻性和前瞻性断言,以确保在IP地址之前或之后没有数字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.