我讀了一個帶有 syslog 內容的 txt 檔案
Oct 3 12:09:01 webv2 CRON[1903]: (root) CMD (sudo /usr/bin/python3 /var/www/security/py_scripts/security_stuff.py 01_report_connections 0 &)
Oct 3 12:09:01 webv2 CRON[1906]: (root) CMD ( [ -x /usr/lib/php/sessionclean ] && if [ ! -d /run/systemd/system ]; then /usr/lib/php/sessionclean; fi)
Oct 3 12:09:03 webv2 systemd[1]: Starting Clean php session files...
...
..
.
在名為data的陣列中(= insert len 6800)
data = string.splitlines()
, 應由正則運算式陣列過濾
regexArray = [
['CRON:', [
'sec_stuff\.py report_cons'
,'\[ -x /usr/lib/php/sessionclean \] && if \[ ! -d /run/systemd/system \]; then /usr/lib/php/sessionclean; fi'
,'...'
,'..'
,'.'
]
],
[...]
]
在一個叫做的普通函式上
def search_regexStuff(what, strings, regexString = ''):
if what == 'allgemein':
return re.findall(r"" regexString "",strings)
,但問題是,他在資料陣列中只找到并洗掉了每個找到的正則運算式內容的一部分。
例如,對于正則運算式:
sec_stuff\.py report_cons
我有 2069 個條目,但他在資料陣列中只洗掉了 1181 個。對于其他正則運算式的東西是同樣的問題。為了:
\[ -x /usr/lib/php/sessionclean \] && if \[ ! -d /run/systemd/system \]; then /usr/lib/php/sessionclean; fi
他找到并洗掉了 68 個中的 59 個
該操作的范圍是:我想通過 pop 或 del 減少每個回圈中該資料陣列的資料 len 以加快搜索回圈。其余的資料陣列我把它寫在另一個檔案中。我找不到我的失敗為什么我的代碼不起作用。看不到失敗。=(請幫助。謝謝
代碼:
for b in regexArray:
for c in b[1]:
regex = '.*' b[0][:-1] '.*' c '.*'
n = -1
for a in data:
n = 1
findLINE = search_regexStuff('allgemein', a, regex)
if len(findLINE) != 0: # found returned arraay not empty
del data[n]
n -= 1
o = ''
for i in data:
o = i '\n'
file = open('/folder/file_x.txt','w')
file.write(str(o))
file.close()
更新(解決方案)和謝謝@timus:
我定義了一個額外的函式,它把新的資料陣列扔給我來解決這個問題
def cleanMyDataArray( data, regex):
o = ''; new_data = []
for a in data:
findLINE = search_regexStuff('allgemein', a, regex)
if len(findLINE) == 0: # not found
new_data.append( a )
return new_data
@代碼:
for b in regexArray:
for c in b[1]:
regex = '.*' b[0][:-1] '.*' c '.*'
data = cleanMyDataArray( data, regex)
而已
uj5u.com熱心網友回復:
您犯了一個典型的錯誤:您在迭代串列時從串列中洗掉了專案。那往往會向南走。此外,修改串列del通常效率不高。
示例:numbers要從中洗掉偶數的串列。你的方法
numbers = [1, 2, 3, 4, 5]
n = -1
for a in numbers:
n = 1
if a % 2 == 0:
del numbers[n]
n -= 1
print(numbers)
結果是[1, 4, 5],這顯然是錯誤的。為什么會這樣:
- 步驟:第一個數字是奇數,所以什么也沒發生,
n變成0。 - 步驟:下一項
2是偶數,因此串列被修改為[1, 3, 4, 5],并n保持0。 - 步驟:現在迭代抓取具有索引
2的專案,即4。由于它是偶數并且n該0 1 == 1專案3被洗掉,因此串列[1, 4, 5]現在是并且n保持0。 - 步驟:剩余的串列有長度
3,所以沒有索引3項,因此迭代停止。
如何解決這個問題?創建一個新串列,最好使用串列推導:
numbers = [1, 2, 3, 4, 5]
numbers = [a for a in numbers if not a % 2 == 0]
print(numbers)
結果:[1, 3, 5]
除此之外:您可以使用該模式
for b in regexArray:
regex = b[0][:-1] '.*(' '|'.join(b[1]) ').*'
而不是遍歷b[1]. 但是在您使用正則運算式時有一些奇怪的部分:
- 你為什么用 關閉你的模式
.*? - 你為什么使用
re.findall而不是re.search? - 你真的使用
'...','..','.'代替'\.\.\.'etc 嗎?像這樣的模式CRON.*....*匹配后面至少有 3 個字符的任何東西CRON——這就是你想要的嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/522683.html
標籤:Python数组排序
上一篇:如何找到具有相同值但以相反順序洗掉其中之一的兩行?在R中
下一篇:動態比較器還是2個獨立的比較器?
