To provide the best experiences, we use technologies like cookies to store and/or access device information. Consenting to these technologies will allow us to process data such as browsing behavior or unique IDs on this site. Not consenting or withdrawing consent, may adversely affect certain features and functions.
The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network.
The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user.
The technical storage or access that is used exclusively for statistical purposes.
The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you.
The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes.
支持
恭喜恭喜,
支持!
已经下单。
好书,正则表达式乃程序员必知必会节省体力劳动的利器啊
恭喜恭喜:)
请问是否有电子版的书的计划….
最近越来越懒得看纸板书了
暂时还没有,等有计划了会通知大家,多谢关心
恭喜!早听闻,已定计划,周末入手。
恭喜!
可惜看不懂个,不然一定买一本,。
到手了,封面很有意思,内容还没仔细研究……
看了试读章节的第一章(还未看完),发现有点错误。
例1-20,有如下问题:
1、两个匹配结果反了,Java和.NET的都是;
2、.NET的两个字符串写反了,匹配模式应该写在后面。
请确认。
多谢你细心指出,之前也有读者提到了这个问题。
已经收录到勘误列表中,下次重印时会修正。
PERL作为最早最好的正则实现之一,书中基本没有提及,有点遗憾,希望再版时能有此部分内容 --尽管PERL现在的使用者在变少。
PHP里的preg就是PCRE正则,一般是兼容Perl的。本书重点讲解正则表达式而非上层语言,相比较而言Perl还是比较小众吧……
其实主要是我对Perl还没有熟悉到有足够信心成章
请问,有没有什么正则工具能测出来回溯次数的?
好像RegexBuddy可以,另外.NET的正则表达式可以详细观察匹配过程
京东搞活动,买了一本。很不错!虽然对RE已经比较熟悉了,读起来还是有很多收获。
另外,发现个小问题,165页验证闰年的代码的逻辑似乎不对,
and int(str) % 400 != 0
应该是
or int(str) % 400 == 0
吧?李卫公同学
是的,这里我弄错了,非常感谢指正!
余老师好~到手后非常喜欢这本书,准备细细品读 😀
在第10页 例1-11时 有些疑惑
我在ubuntu的python27环境下执行
re.search(r"^[012]345]$", "2345") != None
得到的结果与书上不符……
>>> import re
>>> re.search(r"^[012]345]$", "2345") != None
False
可书上写的True……
多谢支持!
这里确实是你说的那样,书上弄错了,惭愧。
我会收录到勘误列表里。
以及下面的例1-12 第二个(汗 这样看书好像效率不高)
>>> re.search(r"^[012\\]345]$", "3") != None
False
另外请问余老师有没有专门为《正则指引》提意见的页面呢?wordpress留言总感觉不是很正式,也不适合讨论(页面拉太长了)~
考虑弄个Google groups/Google code?
没事,有这样认真的读者,是好事。
这点问题也是写错了,我去改。
今天晚点时侯我专门弄个页面出来,方便大家,你等着看通知。
余老师好,又来给您留言啦
这次是 Page 29 中间的部分
对这个表达式稍加改造,就可以写出匹配类似tag的表达式……表格的tag是<tag&rt;
这里应该是<table&rt;吧?
然后是Page 30,最下面,我执行
re.search(r"^.*/", "/usr/local/bin/python").group(0)
的结果如下:>>> re.search(r"^.*/", "/usr/local/bin/python").group(0)
'/usr/local/bin/'
比书上多一个”/”
以及Page 69 图4-2 右上角似乎遗漏了”&rt;”?
最后还得请教下余老师,当我执行Page 30下面的匹配”python”字符串的代码时,把search换成了findall,最后莫名返回了一个空字符串:
>>> re.findall(r"[^/]*$", "/usr/local/bin/python")
['python', '']
这是为什么呢?望余老师解答,谢谢~
自己手打的quote标签和尖括号都乱掉了啊。。-___-#抱歉
没事,我都能看懂。多谢你的悉心反馈,我现在在外面,明天回去仔细看看你的建议再回应。
48页 3-22 第二个例子 出现了两个“年”
感谢指正:)
我这里看似乎是正确的呀,你确定是48页例3-22吗?
在替换字符串里面确实是有两个“年”,第二个“年”应该改成“月”
P10 例 1-11:
这里的 “2345” 应该是 “2345]” 吧.
请问具体是第几行呢?
是第一条和第四条语句.
后来又看到两个:
P10 例1-12 第二句:
r”^[012\\]345]$” => r”^[012\]345]$” # 多打了一个 \
P35 图3-1 “可选出现”上方的:
[^/]*[^/] => [^>]*[^/]
还有就是18楼说的两个”年”我也看到了: r”\1年\2年\3日”
噢,确实是写错了,多谢指正。我已经都收录到勘误列表里了。
以下内容,请余老师确认:
P5 “所以在re.search()之后添加判断返回值是否为None,如果为True,则表示匹配成功”这里应该为“
所以在re.search()之后添加判断返回值是否不为None”吧?
P10例1-12中的第二个,正则已经是原生字符串,是不是多了一个反斜线?
P14例1-20 Java和.NET的结果好像都反了
P20表2-3 self-closing tag的正则与前一段的描述不一致。前面说“注意:这里不是/]+/>”,而表
中确是这个
P21第一行的匹配open tag的正则与P22例2-9中匹配open tags的正则不一致
P35图3-1中的正则的中间部分跟左边文字描述的正则不一致
P38中说“现在有些邮件服务商也允许用户名中出现点号等字符了,这种情况复杂些,此处不做考虑”,
但下文在说用户名的时候却考虑到了
P40“其实,问题可以这样解决….”这一句中少了一个“量”字,“再将它转换为整数类型的变量x”
P43最后一行,应该为”针对多选结构(option1|option2)”
P48例3-23最后一个例子的结果少了中括号
P52例3-30第一个例子结果为空吧?
P52例3-31第一个例子的分组数不足10
惭愧 & 非常感谢你的细心指出,我都收录到勘误列表里去了。
余老师,我说一些前面没有被指出的错误吧!
引子:第 IV 页的 re.search 和 re.findall 两个函数中的 pattern 和 string 都写反了
P3:例 1-3 中关于 Python 的说明一行”能匹配则返回 RegexObject”,应该是”Match object”
P5:第二段中第三行中“请参考第 241 页”,应该是“21 页”吧
P34:例 3-3 中的第二个 re.search 中 re.search(idCardRegex, “1101018001017016”) != None 的结果应该为 False,因为给定的数字是 16 位的,而非 15 位
P38:第二段结尾部分中,邮箱的用户名不可能为空吧?所以 {0,64} 最好改为 {1,64},同理还有第 39 的相关部分;还有 38 页的前一部分用 [\w.]{0,64} 来匹配用户名,但是到了 38 页的最后一段和 39 页的例子当中,却变成了 [-\w.]{0,64},多了一个 ‘-‘,我记得邮箱中好像不允许出现 ‘-‘ 的
P40:第一行代码 re.search(idCard, “1101018001017016”) != None 的结果应为 False
P41:表中最后一行对分钟的匹配 (0?[1-9]|[0-5]\d|60) 中间出现了重复,改成 (0?[1-9]|[1-5]\d|60) 估计更好一点
P41:最后一段,“仔细分析 tag 中可能出现 > 它只可能作为属性…”该句中”它”前面应该加一个逗号
抱歉回复晚了。
非常感谢你的细心回复,这些地方确实是我弄错了,惭愧,我已经把它们全部收录到勘误列表中了。
如果你看到其他错误,请继续告诉我。
另外,希望这本书对你有用。
刚才的回复中,
“P40:第一行代码 re.search(idCard, “1101018001017016″) != None 的结果应为 False”
应该改为“P40:第一行代码 re.search(idCardRegex, “1101018001017016″) != None 的结果应为 False“,一不小心写错了。。。
老师您好,在《精通正则表达式》P162 页中有个测试,就是[0-9]* 这个正则表达式是否会保存 a ▲1234 num这个状态的问题。我测试了一下,我使用ab[0-9]*123cd依然能够匹配ab123cd,这也就说明它是会保存该状态的,但是在P164页的答案中却说不会保存?麻烦您解释下
你好,这里书上说的是没错的。
用[0-9]*匹配a1234,其结果是可以匹配,但匹配的字符串是空,实际上就是a之前的空字符串,整个匹配到这里就结束了,不会继续试探,所以不存在状态a ▲1234 num。
用ab[0-9]*123cd能匹配ab123cd,前面新增了ab,所以[0-9]*开始匹配时,是从1开始的;如果你需要类比,则应当用ab[0-9]*123cd匹配aba123cd,这样看得很明显:)
余老师您好,73页表达式匹配hostname中疑似发现一个错误。
原文:
(?=[-a-zA-Z0-9.]{0,255}(?![-a-zA-Z0-9.]))((?!-)[-a-zA-Z0-9]{1,63}\.)*((?!-)[-a-zA-Z0-9]){1,63}
我认为第二段的(?!-)[-a-zA-Z0-9]不应再加上括号,否则环视(?!-)对每次[-a-zA-Z0-9]匹配都生效,所以不能匹配形如foo-bar的hostname
正确的应该是
(?=[-a-zA-Z0-9.]{0,255}(?![-a-zA-Z0-9.]))((?!-)[-a-zA-Z0-9]{1,63}\.)*(?!-)[-a-zA-Z0-9]{1,63}
望确认。
你说的没错,感谢指出,我已经收录到勘误列表里了。
补充
64页中间一段中
\Z和\的主要区别在于:
应该是
\Z和\z的主要区别
是的,这里确实是我写错了,非常感谢你指出,我已经收录到勘误列表里面了。
老师,麻烦您回答下23楼的问题,谢谢
已经回答了:)
余老师,最近有发现了一些小错误,可能与上面的某个重复,T_T。
P43,中间部分,“正则表达式是(jeff|jefferey)还是(Jeffrey|jeff),结果是…”这一句如果要与下面例子对应的话,应该改为“正则表达式是(jeff|jeffrey)还是(jeffrey|jeff),结果是…”。
P49,倒数第二行中的表达式“”前少了一个“/”,应该改为””。
P55,3.4节最后一段,“为了使代码简洁和易于”,后面好像少了一些内容。
P56,例3-36中,第二行与第一行重复,第三行的“# => True”应该删掉;该页的倒数第三行的正则表达式中,”{2″之后少了一个”}”,应该为”{2}”。
P60,例4-2的结果不对,应该为“tomorrow I will wear in brown standing in row 10 next to the rowdy guy”。
P62,例4-3的第一行正则表达式中,“last line”前面多了一个”\r“。
P63,例4-4第一行中,“ast line”前面少了一个“l”。
P71,例子4-17下面一段,“其中(?!\一种组合”,读起来有点不知所云。
P75,例4-21中的(?!=ab)应为(?<=ab)。
P78,中间的例子(原本编号应为例 4-23)没有编号,这就造成了P79中第一段最后一行“具体的例子可见例4-24”和该页最后一段的“代码见例4-25”指向错误。
P87,第二段下面的正则表达式结尾少了一个“$”;例5-6中的“# enable multiline and extended mode”去掉“multiline mode”;下一行的“# start of whoe regex”应为“# start of whole regex”,同理还有P88页的开头。
P88,表格下面那一段的第一行“例5-6同时指定了…”应为“例5-5同时指定了…”。
P90,例5-7中最后一句的执行结果部分,后两个词各多一个“B”。
P91,例5-8下面一段第二行“\1不在区分大小写模式…”应为“\1不在不区分大小写模式…”,第三行“\1处在区分大小写模式…”应为“\1处在不区分大小写模式…”。
P98,表6-7下面那一段的倒数第二行,"b)"实为"c)"。
P101,例6-9的最后一行,“re.search(r"[()", "(") != None”应为“re.search(r"[(]", "(") != None”;下面段落的倒数第三行,“它可以匹配除^、a、b之外的任何字符”,应该是“它可以匹配的字符是^、a、b”。
P102,6.2.1节的例子中的最后一行,正则表达式周围没有包含在两个分割符内,一般取分割符为"/"。
P107,表6-10的第三个正则表达式“(ab)+”应该是“a+(bc)”。
P116,例7-9下面的一段的最后一行,“\s匹配\S不能匹配的字符”虽然说法没错,但是如果与前面对应的话,改成“\S匹配\s不能匹配的字符”好一点。
P118,例7-12下一段的第二行,"\b\regex\b"应为"\bregex\b"。
P119,倒数第二段的参考页应该是253页,倒数第一段的参考页好像应该是234页。
P120,第一段的参考页好像应该是第6页,而不是105页。
P135,脚注1中的页面引用出了问题,我感觉应该是144页。
P136,最后一行,“需要关注只是”,改成“需要关注的是”好一点。
P144,第三段的否定逆序环视写错了,应为“?<!”,书上写成了“?!<”。
P147,表格中关于 Python 的部分,Python 中没有 re.find 这个函数,我感觉您的意思好像是再说 re.findall,而后面的“逐步进行”应该为“一次性进行”。
P148,例9-3的题目写错了,应该是“函数式处理…”。
P163,例9-14的第二行中的正则表达式好像多了一个"."。
P165,例9-16中的正则表达式感觉还是不能拿来判断闰年,因为同为闰年或者非闰年时,为返回不同的结果;我觉得改为
"return int(str) % 400 == 0 or (re.search(r"\A\d{2}(?!00)([02468][048]|[13579][26])\Z", str))"
可能会好一点;但该表达式也不是通用的,因为它不能判断五位或以上位数表示的年份,我尝试用多选分支写了个判断闰年的通用表达式,但是非常复杂,感觉失去了使用正则表达式的意义。
P239,最后一段的否定逆序环视写错了,应为"(?<!…)"。
P245,第一段的 re.searh 应该全部为 re.match,最后一句的执行结果为 False。
P247,倒数第二个正则表达式的执行结果“One TWO THREE”应为“One Two Three”。
Hello,非常感谢你指出的问题,我已经全部收录到勘误列表里去了。
在本书繁体版要面世之前,可以解决这么多的错漏,真是高兴又惭愧。
P49,我刚刚说的有点问题:倒数第二行中的表达式“”前少了一个“/”,应该改为“”。
不过,虽然有点小错误,这本书深入浅出,看完后还是受益匪浅的,谢谢余老师。
哇,原来上一句是被blog自动给拦截了,T_T。总之就是P49页的倒数第二行的正则表达式有点小问题,余老师应该可以看到。
同理,P60的html标签也被转义了,不过老师应该能发现错误。
余老师您好,以下是我根据您博客中最新的勘误表修改后发现书中的一些问题。
下面是从excel中复制出来的,格式有些乱。
页数 页内位置 修改前 修改后 说明
15 1.8节第二段第二行 Per Perl
48 例3-22上两行 原生字符串(P93) – 应为P9或者P96
56 例3-36 – – 前两行相同
61 第二段第二行 具体情况(P59) – 应为后边Unicode处某内容
65 例4-10第三行 lin1 line1
65 例4-10该页倒数第三行 lin1 line1
68 4.3第二段第一行 ][^>]*> ]*> 保持和第二章勘误的修改一致
69 图4-2上数第二段 – – 最后一个单引号格式与前面的不统一
69 图4-2上数一段 – – 最后一个单引号格式与前面的不统一
69 图4-2中间的表达式 (‘[^’]*’ “[^”]*” [^'”>])+ (‘[^’]*’|”[^”]*”|[^'”>])+ 中间的表达式缺少了|
70 图4-3 – – 第二行和第四行的匹配位置反了
110 注释1 – – 书中标注的是第一行的ASCII编码后边,注释内容是Unicode编码,应该改为第二行Unicode编码后
118 最后一行 表7-4举列列出 表7-4举例列出
141 第5段最后一句 所以下面几种讨论“不超过63个字符”部分的匹配 – 但是下面讨论的是不出现两个连续的点号的匹配
143 第二段第二行 精确是则要保证正则表达式 精确则是要保证正则表达式
147 表格下第二段第一句 如果使用函数式正则表达式采用的是面向对象式处理 如果正则表达式采用的是面向对象式处理 应该没有“使用函数式”几个字
150 第二组列表下一段第三行 。, 。 最后有一个。和一个,相连
150 第三组列表(1) (?=\A.{6, 12}\z) (?=\A.{6,12}\z) {6,12}中间多了个空格
154 第一行 同时需要留下的部分 同时留下需要的部分
157 代码下面一段第二行 deletgate delegate
158 倒数第二行 将它设定为一个小于n的正数,则会进行n-1次切分(只有Python是例外,它会切分n次),返回数组的最后元素包含了“正则表达式第n-1次匹配右侧的所有文本” – 这里第一次用的n是指最多能切分的次数,而后边的n是指设定的切分次数,前后n的含义不统一
162 9.4.1第三行 如果只需要查找;同样, 这中间应该少了部分内容
162 9.4.1第三行 如果只需要判断字符串开头以某个固定字串开头,以某个固定字串结尾 如果只需要判断字符串以某个固定字串开头,以某个固定字串结尾 应当去掉“字符串开头”中的“开头”两字
234 第一段最后一行 因此\d也可以直接写成字符串\\d 因此\d也可以直接写成字符串\d 多出了一个字体错误的\
235 表格中的忽略优先量词 ?* ?+ *? +?
240 第一段代码后两行 – – 注释中的#格式有误
245 14.3.6标题 re.findall(pattern, sting[, flags]) re.findall(pattern, string[, flags])
247 倒数第二行代码 – – 回调函数toUpper在上文中没有出现
勘误12行 页数 25 35
勘误14行 页数 31 35
勘误17行 页内位置 第2段 第1段
勘误54行 页内位置 5.4倒数第3行 5.4倒数第3段
勘误54行 修改前 例5-6同时制定了两种模式 例5-6同时指定了两种模式
勘误57行 页内位置 例5-8下面第1段第2行 例5-8下面第1段第3行
勘误62行 页内位置 例6-9下面一行的倒数第3行 例6-9下面一段的倒数第3行
这本书写得很好,以前对正则表达式总是一知半解的,每次用都要现查,学的一点都不彻底,这回很多东西都弄明白了,感谢余老师。
Hello,感谢指出。
你能直接在Excel中标注,然后发给我吗?我给你发邮件了。
堪误表中第12行标注的第25页的例3-4,实际上应该是在第35页,堪误表里的页码写错了。
刚刚发现,楼上的同学已经指出同样的错误了,呵呵,发重了,不好意思。
话说,余老师有没有考虑过用Git管理书稿?《Git权威指南》的作者蒋鑫老师在书中说他的书稿直接就是用Git来管理的,似乎效果不错,堪误也比较方便,呵呵。
用Git来管理是个不错的主意,不过按照国内出版行业的现状,书稿是.doc格式的,用源代码管理工具的好处并不太大,所以就没选用。
勘误倒是可以考虑用git来管理,我考虑一下吧:)
余老师,您好,我想请教一个问题:《正则指引》书中第32页第1段第2行说想匹配点号本身,必须将它转义为\.。但是第39页例3-8中的emailRegex = r”^[\w.]中却没有使用转义字符转义点号。可是我在计算机上实际测试发现这样写的运行结果并没有错误。请问为什么这里不需要转义也可以使用点号匹配小数点,而不会把*号、#号之类的符号匹配上呢?谢谢!
找到了答案,原来.在[]内不需要转义,详见这里的讨论:http://stackoverflow.com/questions/10397968/escape-dot-in-a-regex-range
根据这个网页的说法:http://www.regular-expressions.info/reference.html,Any character except ^-]\ add that character to the possible matches for the character class.
噢,恭喜。其实点号.在字符组[]内部是不需要转义的,这一点在第55页,3.5.1“转义”一节介绍了,你看是否介绍清楚了?
余老师,您好想问一个问题:正则表达式是否可以匹配非段落换行(不影响段落结构)?若可以,那该如何匹配?谢谢!
你好,请问你可以举详细的例子说明吗?我目前还没完全理解你的意思。
http://www.zhihu.com/question/20723881
哦,这样就清楚了。
这个问题,你首先应该把要处理的文本保存为纯文本形式(不可以有富格式),然后查证换行符的类型(到底是\n,还是\r\n,以下假设是\n)。
观察可知换行符有两种:一种是段落的换行符,通常表现为两个连续的换行符;一种是非段落的换行符,通常表现为单个连续的换行符(之前和之后都不是换行符)。
要去掉的是后一种换行符(去掉这个字符,两行的文字就“连起来”了),所以正则表达式应该是(假设换行符为\n):(?<!\n)\n(?!\n),把它替换为空字符串即可。我用python测试了没问题,你试试看。
第20页表2-3第一行
][^>]*>
勘误说要把第一个方括号里的>去掉,为什么呢?
这样岂不是>也可以匹配了?
囧,尖括号都没了
我的意思是lt gt gt也可以匹配。
不好意思,这几天都没看评论,我回去好好看一下勘误再回复你,先多谢!
保留>,从这个表格本身来说是没问题的,但之前讲解时,方括号里并没有>,有读者认为文字讲解与表格内容不一致,所以需要修正。
不过,还是多谢你的提醒。
与其修正表格的,修正文字讲述不是更好吗?
51页 表3-2中,JavaScript中表达式中的反向引用写法应该为\num,而不是$num
多谢指正!
2012年6月第二次印刷.
P20上说close tag的特点是以。所以对应的是正则表达式是]+>
但这不就能匹配了吗。我想正确的应该是/]+[^>]*>吧。
上面评论的代码有被吞,我改发到Twitter上了,请其他读者忽略.
P29 第七段:
之前匹配JavaScript的表达式<script language=…
是type不是language,真奇怪勘误表怎么没提到这个.
噢,这里确实是写错了,多谢指正,勘误列表我已经更新了
P29 尾注的第二个关键词少了右尖括号,且阴影排版效果不对.
这里也是错了,多谢指正
62开始倒数第二个的阴影效果有误
66用\s+$不是连同换行符会删掉吗?
69图4-2的tag content少了|
72 中英文混排前面少了空格
73 例4-20上面表达式里的第一个句号少了转义符号
275 行開頭添加#”最好加“所有行”前綴。倒數第二個表達式後面的i頗為多餘。
有其他勘误表整理页吗? 这个页的反馈没整理过,太乱啦,没法查
我暂时看了一点点,有以下问题
P21 open tag 匹配方式 /]*> 这样就匹配不到自闭标签的吧
P38 邮箱匹配之用户名 [email protected] [\w._]{} 应该为 [\w\._]{} 而且上面的文字说不考虑用户名含点的情况,例子却有了
留言里字符被过滤了? tag 标签 [^/][^>/]*
有的,请看这里
https://www.lifesailor.me/%e3%80%8a%e6%ad%a3%e5%88%99%e6%8c%87%e5%bc%95%e3%80%8b%e5%8b%98%e8%af%af
余老师,
p214页面,讲解php 的preg_match函数的时候,
下面介绍正则表达式….
preg_match(‘/\d/’,”1″);
preg_match(‘/\d/’,”a1b”); //=>false
//如果是数字1就是true ,如果是字母l就是false
//这里容易混淆啊
1和l是有点容易混淆的隐患,但是这里印刷非常清楚啊,不是吗?
235页的表格中,最后一行
Pytho里面的忽略优先量词应该是 ?? *? +? {n,m}?
问好应该在后面
抱歉,是Python
记下来了,非常感谢指出!
你好!
我购买了《正则指引》(印次:2012年6月第2次印刷)。也从这里下载了勘误表。拜读之后发现了另外二十个疑似笔误。已整理在电子表格里。请给我发个电子邮件以便我把电子表格发给你。
谢谢支持!
已经给你留言的邮箱发邮件了,请查收。
对勘误的excel的勘误
1. 标记为25页 例3-4第3行 的,实际上是35页
2. 标记为31页的 图3-1 实际上是35页 (3.1章)
3. 标记为43页的 例3-5 实际应该是 例3-15
另外,. 在[]里不需要转义,55页没有相关说明 (我手里的版本是2012年5月第一次印刷)
虽然这些勘误看得磕磕碰碰,书内容本身确实非常棒,感谢
谢谢细心指出。我已经更新了勘误表了。很高兴这本书能帮到你。