1

在 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*对任何其他目的有用,而不是不这样做......哪个更简单,更短?

请输入。

4

2 回答 2

3

我没有这本书,所以我不知道作者的意图。但大卫比兹利和他们一样敏锐,所以我只能猜测这是为了区分这两行的输出。

>>> 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]中未由不在匹配组中的字符分隔的所有符号。

于 2014-05-29T04:15:36.530 回答
1

两个正则表达式是不同的。

  • 第一个正则表达式指出,分隔符应该是逗号、分号或空格,可选地后跟空格

  • 第二个正则表达式指出,分隔符应该是一个或多个逗号、分号或空格。

所以按照定义,如果你在下面的字符串上应用正则表达式,你可以很容易地找到区别

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']

现在,您想要什么正则表达式取决于您要处理的输入是什么,以及所有可接受的测试用例的期望输出是什么。

于 2014-05-29T04:16:50.017 回答