作者darkk6 (Mr. Pan)
看板Python
标题Re: [问题] 正规表示法"*?"
时间Sat May 28 22:01:44 2016
※ 引述《cryinrain (哑猫)》之铭言:
: 各位高手好,最近小弟在自学Python
: 在精通Python这本书里面,在正规表示法这段有讲到一个指定符"prev *?"
: 解释是"零个或多个prev,愈少愈好"
: 自己练习测试了半天,却无法理解这个指定符是什麽意思
: 恳请各位高手指导有没有比较容易理解的方式
这边先不讨论 Python , 以 Regexp 来说,用於数量的修饰应
该只针对前面跟随的字元或集合(或群组)
我自己对 Python 的正规表示法没有很熟悉,不知道有没有特殊用法,
但理论上这些应该都是一样的
以这个为例子不是很好,我稍微修改一下成: prev* , 先不考虑那个 ?
以这个例子来说的话, * 代表 "零个以上" 修饰的是 v
因此底下这些都符合这个叙述:
pre
prev
prevv
prevvvvvvvvvvvvvvvvvvvvvvvvv
这样写: (prev)* 的话,那麽底下这些都符合:
<=== 什麽都没有的空字串
prev
prevprev
prevprevprev
回头看这个 ? , 这是当 ? 跟在数量修饰的 + 和 * ...等後面时,是
越少越好
这边举的这个例子也很不好,稍微修改一下: pre
.*x
先看没有加上 ? 的
首先要先知道 * 修饰的是前面的 .
而我们知道 . 代表
任意字元
所以简单来说这个正规表示法就是在描述一个字串是 pre
[任意字元任意数量]x
OK ,那麽底下这几个字串,到底哪边属於 .* 的范围呢?
prevx => pre
vx
prev1234x => pre
v1234x
prevx1234x => pre
vx1234x
第三个是不是出乎意料外呢?
这是初学正规表示法很容易遇到的问题,在 regepx 中,
* 是 greedy:贪婪模式,
尽可能的取,但还是要尽量能符合这个表示法
因此在第三个字串中,虽然遇到了 prev
x1234x 这个 x
但是他发现,後面还有一个 x 还可以让我符合这个表示法
所以他会很贪心的把第一个 x 和後面的 1234 一并吃掉
所以第三个字串的 .* 会把 pre
vx1234x 黄色部分都吃掉
如果现在加上了 ? ,也就是: pre
.*?x
那麽这样就不是贪婪模式了,而是 Reluctant ,尽量少取
前量个范例得到的结果都相同,而第三个的 .*? 就只会把 pre
vx1234x
这个 v 给吃掉,这就是所谓的取越少越好。
当然这边还关系到你是要 match 还是只是 search , 会有所不同。
但他的概念就是这样。
参考用 js 实作的部分:
https://jsfiddle.net/tz9kpcrb/2/
或者执行这个 code 试试看:
import re
ptr1='pre(.*)x'
ptr2='pre(.*?)x'
print(re.findall(ptr1,'prevx1234x'))
print(re.findall(ptr2,'prevx1234x'))
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 223.139.154.78
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1464444106.A.7C3.html
※ 编辑: darkk6 (223.139.154.78), 05/28/2016 22:24:20
1F:推 wadd: 用心。清楚的好文 06/07 09:42