在Python Cookbook 3rd Edition的第2章第2.1节中,您有以下内容:
>>> line = 'asdf fjdk; afed, fjek,asdf, foo'
>>> import re
>>> re.split(r'[;,\s]\s*', line)
['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']
是的,这是一个很好的例子......但是当我尝试删除正则表达式中的\s*
时它仍然具有相同的效果...见下文:
>>> re.split(r'[;,\s]*', line)
['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']
那么,作者有什么想要使冗余的\s*
用于任何其他目的而不是没有...这更简单,更短?
请输入你的内容。
答案 0 :(得分:3)
我没有这本书,所以我不知道作者的意图。但是David Beazley和他们一样敏锐,所以我只能猜测是要区分这两行的输出。
>>> line = 'asdf fjdk; afed, fjek,asdf, foo'
>>> line = 'asdf fjdk; ; afed, fjek,asdf, foo'
使用本书中的正则表达式,第二行将是
['asdf', 'fjdk', '', 'afed', 'fjek', 'asdf', 'foo']
并使用您修改的正则表达式
['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']
您的正则表达式将折叠组[;,\s]
中未被匹配组中没有的字符分隔的所有符号。
答案 1 :(得分:1)
两个正则表达式都不同。
第一个正则表达式指出,分隔符应该是逗号,分号或空格(可选地后跟空格)
第二个正则表达式指出,分隔符应该是一个或多个逗号,分号或空格。
因此,按照定义,如果将regex应用于以下字符串,则可以轻松找到差异
line = 'asdf fjdk;; afed, fjek,asdf, foo'
所以现在结果会有所不同
>>> re.split(r'[;,\s]*', line)
['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']
>>> re.split(r'[;,\s]\s*', line)
['asdf', 'fjdk', '', 'afed', 'fjek', 'asdf', 'foo']
现在,你想要的正则表达式取决于你将要处理的输入是什么,以及所有可接受的测试用例的期望输出是什么。