使用re.split(来自python cookbook)在python中使用多个分隔符拆分字符串

时间:2014-05-29 04:03:48

标签: python regex delimited-text cookbook

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

请输入你的内容。

2 个答案:

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

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