正則表達式快速處理微信聊天記錄

殺雞要用牛刀

沛哥最近出差比較忙,積累了很多聊天記錄沒有處理,一下子處理這麼多聊天記錄,不是沛哥這種懶人的風格。於是乎開始繼續雕琢沛哥的工具。

正則表達式快速處理微信聊天記錄

第一步,通過多選→郵件發送到印象筆記專屬郵箱→批量保存的操作,我們已經get到了。

第二步,要對文本內容進行加工彙總。通過印象筆記保存之後,複製內容到Word中。我們觀察一下,大部分內容是井底望天作為發言人產生的。因此很多內容是連續在一起的。需要把連續發言的部分,去掉暱稱合併成為一個發言人。也就是把多個分散的段落整合為一個發言段落。減少中間的冗餘字符串,提升閱讀效率。

識別文本特徵


正則表達式快速處理微信聊天記錄


祭上神器:正則表達式

首先識別文本特徵,對應的處理方式,首先識別發言人暱稱:井底望天+空格+小時+分鐘,對應的替換邏輯為 井底望天 ([0-9]{2}):([0-9]{2}) 替換內容為空。


正則表達式快速處理微信聊天記錄


替換後的效果如下


正則表達式快速處理微信聊天記錄


可以看到替換後有很多空行出現。原因是替換的內容中,沒有換行符。 我們加入一下換行符試一試,看看能不能直接把文本和多餘的換行符一起替換掉,第一次,先不勾選使用通配符


正則表達式快速處理微信聊天記錄


勾選使用通配符,word提示,這個換行符在通配符中無法查找。


正則表達式快速處理微信聊天記錄


退而求其次, 而且為了後面的處理考慮,經過測試,把這部分井底望天 ([0-9]{2}):([0-9]{2}) 內容替換為$,也就是美元符號$


正則表達式快速處理微信聊天記錄


然後開始錄製下一段宏。

第二段批處理

替換完之後,我們還需要在把首行的$替換為發言人暱稱:井底望天:並且進行加粗 然後中間的美元符號,換行符替換。我們識別一下規律,調整為兩個換行符中間一個美元符號$。 這個宏就錄到這裡,因為中間需要一些手動處理的段落。 然後把每一個環節的$美元符號前面的換行符刪除掉,這樣^p$^p替換命令在替換的時候就無法匹配前面的換行符^p,而留下美元符號$。留下的美元符號,是作為段首的標記留作後面的處理。 這樣只需要在每個段首的美元符號手動做一個刪除換行符的操作即可,留下美元符號$。

第一步:把^p$^p替換為$,


正則表達式快速處理微信聊天記錄


替換完之後的效果


正則表達式快速處理微信聊天記錄


第二步:把手動處理後的段首美元符號$,替換為發言人暱稱:井底望天:替換的時候需要在暱稱前面加兩個換行符。另外需要按下ctrl+B對替換後的暱稱逆行加粗處理。


正則表達式快速處理微信聊天記錄


井底望天作為發言人的部分處理完了。還有其他群友發言的部分,需要在暱稱前面加換行符處理。需要在文本中每個暱稱的前面加一個換行符,單獨起一行。


正則表達式快速處理微信聊天記錄


我們識別一下這個部分的特徵,一個加粗的暱稱,空格,小時,分鐘這種結構。正則表達式的寫法 () ([0-9]{2}):([0-9]{2})替換為^p\1\2:\3 觀察文本結構的特徵,每個暱稱後面都有一個時間格式,時間格式通過([0-9]{2}):([0-9]{2})來進行匹配,很容易做到。 但是前面的暱稱有的有漢字,有的有英文,而且長度不等,還有漢字英文的混雜。沛哥嘗試過用漢字進行匹配,用漢字加英文的表達式進行匹配。[\u4e00-\u9fa5_a-zA-Z0-9]效果都不盡如人意。 看了很多資料,最後想到,不區分漢字還是英文,看作一個字符串,做模糊識別。於是用()匹配,效果非常贊。 注意後面要有空格。 替換對象說明 首先是()和([0-9]{2})和([0-9]{2}),三個括號,分別代表三個字符組。而\1和\2和\3分別對應這三個字符組。我們的需求是在字符組的整體前面加上一個換行。換行通過^p作為換行符來實現。 至於\2和\3之間的分號“:”不在括號內,需要保留處理,08:34處理後會得到0834這樣的結果,就失去了一個完整的時間格式。 下午測試的過程中,又出現了一些問題,沛哥調整了一下正則表達式的寫法,降低了一下複雜度。把多個表達式合併在一起了。具體的就是去掉中間的括號( [0-9]{2}:[0-9]{2}) 如果直接替換,會得到的效果如下。並不是我們想要的結果,本意是想在暱稱前面加換行符,結果匹配的內容很多並不是。


正則表達式快速處理微信聊天記錄


我們來看一下匹配過程。


正則表達式快速處理微信聊天記錄


正則表達式快速處理微信聊天記錄


因為好用,但是也容易產生錯誤匹配,因此需要一些限制。


正則表達式快速處理微信聊天記錄


我們觀察到所有的暱稱都是加粗的。鼠標光標放到查找內容這裡,按下Crl+B,對匹配格式做了限制 再次點擊全部替換,得到的結果就是我們想要的結果了。只匹配加粗的文本。防止對其他文本的錯誤匹配。


正則表達式快速處理微信聊天記錄



正則表達式快速處理微信聊天記錄


兩次宏處理後的效果

正則表達式快速處理微信聊天記錄


兩次宏處理後德效果

簡化後的正則表達式只適合處理在這個字符組的開頭或者結尾做批量處理,無法在字符的中間做處理,如果需要在中間做處理的話,還是分解成多個串聯的字符組比較好處理。 事實證明,對於文本特徵的瞭解和分析是多麼重要。 貌似掌握一個技能和靈活應用,get到其中的精髓,沒有捷徑,通過笨辦法反反覆覆的練習,嘗試。 殺雞要用牛刀,而牛刀需要反反覆覆的打磨。 通過具體的任務驅動,沛哥對於正則表達式的掌握又精進了一個層次。

最後附上完整的宏處理的代碼

Sub 井底望天聊天記錄整理第一段()

'

' 聊天記錄整理 宏

'

'

Selection.Find.ClearFormatting

Selection.Find.Replacement.ClearFormatting

With Selection.Find

.Text = "Dear:^p"

.Replacement.Text = ""

.Forward = True

.Wrap = wdFindContinue

.Format = False

.MatchCase = False

.MatchWholeWord = False

.MatchByte = False

.MatchWildcards = False

.MatchSoundsLike = False

.MatchAllWordForms = False

End With

Selection.Find.Execute Replace:=wdReplaceAll

Selection.Find.ClearFormatting

Selection.Find.Replacement.ClearFormatting

With Selection.Find

.Text = "SWTC區塊鏈15群 微信群上的聊天記錄如下,請查收。"

.Replacement.Text = "整理自【SWTC區塊鏈15群 微信群上的聊天記錄】"

.Forward = True

.Wrap = wdFindContinue

.Format = False

.MatchCase = False

.MatchWholeWord = False

.MatchByte = False

.MatchWildcards = False

.MatchSoundsLike = False

.MatchAllWordForms = False

End With

Selection.Find.Execute Replace:=wdReplaceAll

Selection.Find.ClearFormatting

Selection.Find.Replacement.ClearFormatting

With Selection.Find

.Text = "SWTC區塊鏈15群 微信群上的聊天記錄如下,請查收。"

.Replacement.Text = "整理自【SWTC區塊鏈15群 微信群上的聊天記錄】"

.Forward = True

.Wrap = wdFindContinue

.Format = False

.MatchCase = False

.MatchWholeWord = False

.MatchByte = False

.MatchWildcards = False

.MatchSoundsLike = False

.MatchAllWordForms = False

End With

Selection.Find.ClearFormatting

Selection.Find.Replacement.ClearFormatting

With Selection.Find

.Text = "井底望天 ([0-9]{2}):([0-9]{2})"

.Replacement.Text = "$"

.Forward = True

.Wrap = wdFindContinue

.Format = False

.MatchCase = False

.MatchWholeWord = False

.MatchByte = False

.MatchAllWordForms = False

.MatchSoundsLike = False

.MatchWildcards = True

End With

Selection.Find.Execute Replace:=wdReplaceAll

End Sub

Sub 井底望天聊天記錄整理第二段()

'

' 聊天記錄整理2 宏

'

'

Selection.Find.ClearFormatting

Selection.Find.Replacement.ClearFormatting

With Selection.Find

.Text = "^p$^p"

.Replacement.Text = "。"

.Forward = True

.Wrap = wdFindContinue

.Format = False

.MatchCase = False

.MatchWholeWord = False

.MatchByte = False

.MatchWildcards = False

.MatchSoundsLike = False

.MatchAllWordForms = False

End With

Selection.Find.Execute Replace:=wdReplaceAll

Selection.Find.ClearFormatting

Selection.Find.Replacement.ClearFormatting

Selection.Find.Replacement.Font.Bold = True

With Selection.Find

.Text = "$"

.Replacement.Text = "^p^p井底望天:"

.Forward = True

.Wrap = wdFindContinue

.Format = True

.MatchCase = False

.MatchWholeWord = False

.MatchByte = False

.MatchWildcards = False

.MatchSoundsLike = False

.MatchAllWordForms = False

End With

Selection.Find.Execute Replace:=wdReplaceAll

Selection.Find.ClearFormatting

Selection.Find.Font.Bold = True

Selection.Find.Replacement.ClearFormatting

With Selection.Find

.Text = "( [0-9]{2}:[0-9]{2})"

.Replacement.Text = "^p\1"

.Forward = True

.Wrap = wdFindContinue

.Format = True

.MatchCase = False

.MatchWholeWord = False

.MatchByte = False

.MatchAllWordForms = False

.MatchSoundsLike = False

.MatchWildcards = True

End With

Selection.Find.Execute Replace:=wdReplaceAll

End Sub


分享到:


相關文章: