Re: [问题] 正规表示法"*?"

楼主: darkk6 (Mr. Pan)   2016-05-28 22:01:44
※ 引述《cryinrain (哑猫)》之铭言:
: 各位高手好,最近小弟在自学Python
: 在精通Python这本书里面,在正规表示法这段有讲到一个指定符"prev *?"
: 解释是"零个或多个prev,愈少愈好"
: 自己练习测试了半天,却无法理解这个指定符是什么意思
: 恳请各位高手指导有没有比较容易理解的方式
这边先不讨论 Python , 以 Regexp 来说,用于数量的修饰应
该只针对前面跟随的字符或集合(或群组)
我自己对 Python 的正规表示法没有很熟悉,不知道有没有特殊用法,
但理论上这些应该都是一样的
以这个为例子不是很好,我稍微修改一下成: prev* , 先不考虑那个 ?
以这个例子来说的话, * 代表 "零个以上" 修饰的是 v
因此底下这些都符合这个叙述:
pre
prev
prevv
prevvvvvvvvvvvvvvvvvvvvvvvvv
这样写: (prev)* 的话,那么底下这些都符合:
<=== 什么都没有的空字串
prev
prevprev
prevprevprev
回头看这个 ? , 这是当 ? 跟在数量修饰的 + 和 * ...等后面时,是越少越好
这边举的这个例子也很不好,稍微修改一下: pre.*x
先看没有加上 ? 的
首先要先知道 * 修饰的是前面的 .
而我们知道 . 代表任意字符
所以简单来说这个正规表示法就是在描述一个字串是 pre[任意字符任意数量]x
OK ,那么底下这几个字串,到底哪边属于 .* 的范围呢?
prevx => prevx
prev1234x => prev1234x
prevx1234x => prevx1234x
第三个是不是出乎意料外呢?
这是初学正规表示法很容易遇到的问题,在 regepx 中,
* 是 greedy:贪婪模式,尽可能的取,但还是要尽量能符合这个表示法
因此在第三个字串中,虽然遇到了 prevx1234x 这个 x
但是他发现,后面还有一个 x 还可以让我符合这个表示法
所以他会很贪心的把第一个 x 和后面的 1234 一并吃掉
所以第三个字串的 .* 会把 prevx1234x 黄色部分都吃掉
如果现在加上了 ? ,也就是: pre.*?x
那么这样就不是贪婪模式了,而是 Reluctant ,尽量少取
前量个范例得到的结果都相同,而第三个的 .*? 就只会把 prevx1234x
这个 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'))
作者: wadd (丑男转世-低调)   2016-06-07 09:42:00
用心。清楚的好文

Links booklink

Contact Us: admin [ a t ] ucptt.com