[問題] 全文取代 [提問2]

看板Python作者 (長工)時間12年前 (2013/08/19 13:32), 編輯推噓1(1039)
留言40則, 4人參與, 最新討論串1/2 (看更多)
求教各位先進。 之前問過一個問題關於全文取代的問題。 後來找到了一些方法可以簡單的把事情處理完。 目前我用的全文取代方案如下…… s = open(filename).read().replace('aaa', 'bbb') 現在又遇到一個問題,如何『有條件』的做全文取代呢? Ex: 一個檔案裡面,有多筆「set aaa bbb ccc」 我想要把 set 開頭的字串修改成 「ccc #bbb」 這樣子有辦法像上面一樣用比較簡單的方式完成嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 113.196.32.125

08/19 15:20, , 1F
乖乖去研究regex比較有幫助。
08/19 15:20, 1F

08/19 15:25, , 2F
能夠舉些例子嗎?regex 我也略懂,但就沒有什麼頭緒!
08/19 15:25, 2F

08/19 15:51, , 3F
目前只想到下面這樣子
08/19 15:51, 3F

08/19 15:51, , 4F
re.search('lset.*',s).group().split()
08/19 15:51, 4F

08/19 16:28, , 6F
看你上篇文已經知道sub啦,該不會不知道backreference?
08/19 16:28, 6F

08/19 16:28, , 7F
你的問題大致上就像這樣:
08/19 16:28, 7F

08/19 16:29, , 8F
re.sub(r'set\s+(\w+)\s+(\w+)\s+(\w+)', r'\3 #\2', s)
08/19 16:29, 8F

08/19 19:03, , 9F
回樓上,這方法好像行不通也!我剛剛試了很多次,不行!
08/19 19:03, 9F

08/19 19:08, , 10F
(\w+) 不能匹配'逗點、等於'之類的符號也,Perl可以的說
08/19 19:08, 10F

08/19 19:22, , 11F
我和 Perl 不熟, 不過這世界上絕大多數的 regex 引擎中
08/19 19:22, 11F

08/19 19:22, , 12F
\w 應該都沒有包含標點符號, 只包含 alphanumeric 和底線
08/19 19:22, 12F

08/19 19:26, , 13F
...那就自己加啊。話說perl的\w定義跟python一樣啊,
08/19 19:26, 13F

08/19 19:26, , 14F
你確定perl可以?
08/19 19:26, 14F

08/19 19:48, , 15F
可以匹配下面這個字串試試看,我是匹配不出來就是了!
08/19 19:48, 15F

08/19 19:48, , 16F
lset RncFunction=1,UtranCell=20061$ agpsEnabled 1
08/19 19:48, 16F

08/19 20:35, , 17F
那perl的pattern長什麼樣子?
08/19 20:35, 17F

08/19 23:20, , 18F
OMG !! 我記錯了,Perl同樣不能匹配'符號'。
08/19 23:20, 18F

08/19 23:20, , 19F
看來還得再找找看有沒有其它方法…… 搜尋ING
08/19 23:20, 19F

08/20 00:09, , 20F
把\w+改成符合你資料規律的pattern就好啦@@
08/20 00:09, 20F

08/20 12:37, , 21F
但偏偏它就是不一定有規律,等號有時一個有時三四個。
08/20 12:37, 21F

08/20 13:01, , 22F
[\w,=.]+ 這樣不行嗎...
08/20 13:01, 22F

08/20 13:18, , 23F
樓上,他的字串還有$。原po真的有仔細研究re嗎?感覺你
08/20 13:18, 23F

08/20 13:19, , 24F
連set跟repetition都不清楚啊。
08/20 13:19, 24F

08/20 13:27, , 25F
話說你預期你給的字串會跑出啥?"1 #agpsEnabled"?
08/20 13:27, 25F

08/20 13:43, , 26F
改成 [^ ]* 算了..
08/20 13:43, 26F

08/20 17:39, , 27F
用樓上的方法可以匹配到,但是要怎麼樣子做置換呢?
08/20 17:39, 27F

08/20 17:40, , 28F
用 '\3 #\2' 的話,會回應 '\x03 #\x02',這行不通也!
08/20 17:40, 28F

08/20 19:27, , 29F
你沒有在字串前加r
08/20 19:27, 29F

08/21 01:05, , 30F
你真的該去看看re的說明再來討論..
08/21 01:05, 30F

08/21 14:50, , 31F
我有在字串前加 r 的,貼上來的時候沒有加上而已。
08/21 14:50, 31F

08/21 14:51, , 32F
我改用個方式和大家討論吧!免得造成誤會了
08/21 14:51, 32F

08/21 14:51, , 33F
08/21 14:51, 33F

08/21 14:52, , 34F
在上面的代碼中,它可以實現,單筆置換。但全文失敗。
08/21 14:52, 34F

08/21 15:22, , 35F
是你沒把格式講清楚吧..? 你預期的output是?
08/21 15:22, 35F

08/21 15:46, , 36F
預期是把整個文件裡面符合條件的字串全部做取代
08/21 15:46, 36F

08/21 16:02, , 37F
我做了一些改動,但是最後一行還是錯了!
08/21 16:02, 37F

08/21 16:02, , 38F

08/21 16:59, , 39F
最後我把它做成下面這樣子,不知道會不會有什麼隱憂
08/21 16:59, 39F

08/21 16:59, , 40F
文章代碼(AID): #1I4Qu7c7 (Python)
討論串 (同標題文章)
文章代碼(AID): #1I4Qu7c7 (Python)