使用re.split在Python中用多个分隔符拆分字符串(来自Python Cookbook)
在《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]
这个组里的所有符号合并在一起,只要它们之间没有其他不在这个组里的字符。