Python 記一次憑想象重複造輪子的錯誤示範

2021-08-20 15:00:39 字數 2272 閱讀 7862

讀文件的意義在於知道別人已經實現了什麼,怎麼用

讀原始碼的意義在於知道輪子是怎麼造出來的

要好好學英語

用了三天的時間造了乙個方形輪子,記錄下來以吸取教訓。

需求是用正則匹配一段文章,有n個匹配項,指定刪除其中的某乙個(第1個/第2個/倒數第1個…)

python re庫的文件是英文的,在提不起興趣一句一句翻譯下,從這裡開始走上了一條岔路。

錯誤的實現思路:

if index < 0: # 反向匹配

front = str1

rear = ''

for i in range(abs(index)):

try:

_front_ = re \

.search(r'.*(?=' + reg + ')', front) \

.group()

_cur_ = re \

.search(r'' + reg + '$', re.search(r'.*(' + reg + ')', front).group()) \

.group()

_rear_ = re.compile(r'.*(' + reg + ')').sub('', front)

except attributeerror:

break

else:

if i != (-1 - index):

rear = _cur_ + _rear_ + rear

else:

rear = _rear_ + rear

front = _front_

else: # 正向匹配

front = ''

rear = str1

for i in range(index + 1):

try:

obj = re.search(r'' + reg, rear)

start = obj.start()

end = obj.end()

_front_ = rear[0:start]

_rear_ = rear[end:]

_cur_ = rear[start:end]

except attributeerror:

break

else:

if i != index:

front = front + _front_ + _cur_

else:

front = front + _front_

rear = _rear_

str1 = front + rear

print(str1)

正確的實現思路:

re.finditer()返回的物件中包含了匹配項的開始/結束位置,只要把前後內容拼起來,丟棄匹配的位置就可以了。

import re

str1 = 'a1b1c1d1e.a2b2c2d2e.a3b3c3d3e.a4b4c4d4e.a5b5c5d5e.'

rules = ': 2,

'b\d': -1,

'c\d': -3,

'd\d': -3,

}for (reg, index) in rules.items():

pos = [(m.start(0), m.end(0)) for

m in re.finditer(reg, str1)][index]

print(pos)

front = str1[:pos[0]]

rear = str1[pos[1]:]

str1 = front + rear

print(str1)

輪子跑起來後運**況很糟糕,65000條資料清洗4條正則匹配項花了10分鐘,更換完輪子方法後只用了2分鐘。

記一次Python爬蟲入門

程式思路 程式步驟 2 分析該網頁的 3 findall查詢出所有的url,儲存到list中 4 遍歷list,儲存到本地 程式原始碼 請求網頁 import time import requests import re import os 請求頭部 headers response request...

記一次除錯

這是我最近幾個月來遇到的最棘手的乙個問題 昨天花了4個小時找出第一層次的原因 這個糾結啊,本來和老婆說好準時下班回家吃飯的,結果被這個問題拖了老久。這是乙個gradle的plugin,用來resolve公司內部的dependency的,弄完了跑測試專案的,拋乙個npe,而且npe還不在自己的 裡面。...

記一次 EqualsAndHashCode的疑惑

lombok的使用真的是讓開發人員欲罷不能,乙個 data不管有多少屬性全部搞定,以後加字段也不用從新生成get和set方法。不過這裡還是有乙個小坑需要注意一下,舉個例子 public class equalsandhashcodetest data noargsconstructor access...