• 3

[研究]正規表示式 Regular Expression的真義~

先說明本人沒有任何目的,不是作業也不是工作。
本身從事電腦程式工作已久,但最近有個搞財務工程的朋友給我一個難題。
一直苦苦思索到現在只有想到一半的解法
所以跑來01純粹"以武會友"
想看看是否有人能解!

如下的一堆資料

2809,京城銀,"11,220,655",153,"61,230,329",5.35,5.48,5.20,5.46,+,0.19,5.46,2,5.47,12,16.55
2812,台中銀,"3,294,297",782,"22,636,005",6.96,6.98,6.80,6.95,+,0.25,6.89,10,6.95,12,6.15
2816,旺旺保,"48,573",23,"336,330",6.99,6.99,6.81,6.95,+,0.24,6.90,1,6.94,2,0.00
2820,華票,"1,690,033",337,"6,838,349",4.04,4.11,3.97,4.01,+,0.04,4.01,121,4.03,1,8.72
2832,台產,"379,071",130,"5,360,168",14.30,14.30,14.00,14.25,+,0.25,14.05,2,14.25,6,6.79

目的是想把所有雙引號包起來的數字,以第一行為例"11,220,655"變成"11220655"、"61,230,329"變成"61230329",也就是要去掉雙引號包起來裡面的逗號(千分位符號),但其他非雙引號相關的逗號則不改變。
這個問題複雜的地方就在於有些包起來裡面的有可能是一個兩個或三四個逗號
本人直覺想到用Regular Expression來達到程式自動化的目的。
卻發現用"[0-9]+這樣的寫法似乎只能滿足某些條件
或許是小弟學藝不精
希望可以互相切磋!

用Excel或其他工具不在此討論,純粹想研究正規表示式的寫法!
2008-10-22 11:21 發佈
joenmakiki wrote:
先說明本人沒有任何目...(恕刪)


拿EditPlus來說吧,在替換對話框中選中正規表達式選項
只有""里的,才需要刪掉,上面的做法會刪掉“”外的,號
查找中填:("[0-9]+),([0-9]+)
替換為填:\1\2
這樣“”里有幾個,號就點幾次全部替換,就不會出現刪錯的情形了
感謝回復
如果照你([0-9]),([0-9])的寫法
只能找到數字,數字
並不能找到"數字,數字,數字"
正規表示式我多少懂一點
其實"[0-9]+\,.[0-9]+\,.[0-9]+"
這樣是可以滿足我的需求
但是他只會找到三個逗點的
如果兩個或四個就不行了
我想要一次解決
不要parsing多次
joenmakiki wrote:
感謝回復如果照你([...(恕刪)



這種某個范圍內多段且段數不定的一次解決我搞不定
在EditPlus里只想得出("[0-9]+),([0-9]+)再加多次替換的方法
等著看有無高人來解決,使用Shell腳本來一次完成?
小弟習慣用notepad ++
其實也只是想共同研究
畢竟RE這種東西真是博大精深
小弟以平常寫程式為業所培養出的功力也僅窺一二
所以才想大家一起研究
畢竟可以從case study中學到很多不是翻翻書或看看範例就可以得到的東西
希望大家功力更上一層樓

joenmakiki wrote:
RE這種東西真是博大精深...(恕刪)



贊同這句話
關鍵是功力尚淺,所以我有時候各種方法結合一起用
此文中的用法在實際使用中是常見的,拋出來討論很好,等著把璞玉引出來
大家也好學習一下
以下是python的RE處理方法
除了第一個動作適合用RE的方法做外
method的動作應該直接用replace替代即可
還是應要求用RE的方示做 ^^
我想這個方法應該也不是樓主要的吧
不過寫出來就順手po一下囉

import re, string

def trimComma(match):
 p2 = re.compile(',')
 strobj = match.group()
 return p2.sub('',strobj)


if __name__ == '__main__':
 input_data = ['2809,京城銀,"11,220,655",153,"61,230,329",5.35,5.48,5.20,5.46,+,0.19,5.46,2,5.47,12,16.55','2812,台中銀,"3,294,297",782,"22,636,005",6.96,6.98,6.80,6.95,+,0.25,6.89,10,6.95,12,6.15','2816,旺旺保,"48,573",23,"336,330",6.99,6.99,6.81,6.95,+,0.24,6.90,1,6.94,2,0.00','2820,華票,"1,690,033",337,"6,838,349",4.04,4.11,3.97,4.01,+,0.04,4.01,121,4.03,1,8.72','2832,台產,"379,071",130,"5,360,168",14.30,14.30,14.00,14.25,+,0.25,14.05,2,14.25,6,6.79']
 p = re.compile('"([0-9]+,)*[0-9]+"')
 for s in input_data:
   print s
   print p.sub(trimComma,s)
這是 CSV 格式, 將此資料以 CSV 為副檔名存檔後, 用 Excel 開啟即可自動幫你完成工作...

若要自己寫程式, 可以用 CSV, "Regular Expression" 去搜尋, 應該可以找到很多...
patten的下法是"([0-9,]+)"
這樣就能不管有幾個逗號, 都能抓出引號內的數字
不需要拼成("[0-9]+),([0-9]+)這種

但是如果要繼續做過濾掉逗號....是不是能完全不靠程式解決..這個我不確定
如果是我的話, 應該會接著用match group去做replace把逗號處理掉
https://jin.tw
比較好奇為什麼一定要一次解決?
如果能多次的話,就簡單多了
  • 3
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?