作者ck574b027 (荒围!定厝!贼!妹!)
看板Python
标题Re: [问题] 全文取代 [提问2]
时间Wed Aug 21 18:21:49 2013
※ 引述《play9091 (长工)》之铭言:
恕删
2F:→ play9091:在上面的代码中,它可以实现,单笔置换。但全文失败。 08/21 14:52
3F:→ play9091:我做了一些改动,但是最後一行还是错了! 08/21 16:02
5F:→ play9091:最後我把它做成下面这样子,不知道会不会有什麽隐忧 08/21 16:59
鉴於不能让新人一知半解的精神,只好来解释三个连结的pattern有什麽差别。
虽然我这篇文讲的东西在官方文件都有= =
首先,*跟+的行为都是 greedy 的,
这就是为何第一个连结会把 lset 也纳入第三 group 里,
因为 [^ ]* 包括换行,它只有遇到空白才会停下来,於是顺便吃掉 lset。
若检查一下档案,仅加入会遇到的字元如 [\w,=$],
或是让它不要 greedy ,就不会有看起来很奇怪的结果。
第二个连结最後一行也是一样的道理,pattern 只有挡掉遇到空白後没有换行的情形,
没有挡掉没遇到空白就直接结束的情形。
最後 (.*) 可以用的原因很简单,就是.不包含换行。
这种做法当然会有隐忧,若档案里只有 lset 资料跟空白就爆炸了,
但解法也很容易,一样不要 greedy 就 ok 了。
若档案每行都只包含一组lset,
那原po需要的 pattern 只是 r'lset\s+(.*?)\s+(.*?)\s+(.*?)'
绕了一大圈,仔细想想还满空虚的,都怪被 aaa bbb 误导,以为只有word。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 123.194.13.159
7F:推 play9091:其实,您最後面说到的方法,我一开始就试了。结果是不行 08/21 18:44
啊忘记\s包括换行,我改成非greedy了。
※ 编辑: ck574b027 来自: 123.194.13.159 (08/21 20:31)
9F:推 play9091:加上问号後,的确可以了,但是最後一个匹配不用问号! 08/21 21:39
11F:推 play9091:一直没懂'问号'是怎麽用的?烦请指教…… 08/21 21:45
12F:→ ck574b027:?就是叫*或+配越少字越好,不要greedy的意思。 08/21 22:40