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

1 投票
2 回答
2642 浏览
提问于 2025-04-18 07:54

在《Python Cookbook》第三版的第二章第二节中,你会看到以下内容:

>>> 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 个回答

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

你需要选择哪个正则表达式,取决于你要处理的输入是什么,以及你希望得到的输出是什么,这些都是你可以接受的测试案例。

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] 这个组里的所有符号合并在一起,只要它们之间没有其他不在这个组里的字符。

撰写回答