为了让你的代码更具Python风格,你必须意识到在Python中,
a[i]是一个字符串,而不是
如果a[i]==''则删除a[i]
,最好的方法是
如果a[i]!=''则保留a[i]
。
因此,不要使用以下方式:
def squeeze(toks):
import re
p = re.compile(r'\W+')
a = p.split( toks )
for i in range(0, len(a)):
if len(a[i]) == 0:
del a[i]
return ' '.join(a)
写
def squeeze(toks):
import re
p = re.compile(r'\W+')
a = p.split( toks )
a = [x for x in a if x]
return ' '.join(a)
然后
def squeeze(toks):
import re
p = re.compile(r'\W+')
return ' '.join([x for x in p.split( toks ) if x])
接下来,需要考虑到一个函数可以接收生成器和列表:
def squeeze(toks):
import re
p = re.compile(r'\W+')
return ' '.join((x for x in p.split( toks ) if x))
而且双括号不是必须的:
def squeeze(toks):
import re
p = re.compile(r'\W+')
return ' '.join(x for x in p.split( toks ) if x)
.
.
此外,与其让 Python 每次调用函数
squeeze() 时都去验证命名空间中是否存在
re
(这就是它的工作方式),不如将
re
作为默认参数传递进去更好:
import re
def squeeze(toks,re = re):
p = re.compile(r'\W+')
return ' '.join(x for x in p.split( toks ) if x)
而且,更好的是:
import re
def squeeze(toks,p = re.compile(r'\W+')):
return ' '.join(x for x in p.split( toks ) if x)
.
.
注意:表达式中的
if x
部分仅有在列表
p.split( toks )
以空格开头和结尾时才能将标题
''
和结束
''
分离出来。
然而,与其进行分割,保留所需内容同样好。
import re
def squeeze(toks,p = re.compile(r'\w+')):
return ' '.join(p.findall(toks))
.
.
所有这些说法,你问题中的模式r'\W+'
是不适合你的目的的,正如John Machin所指出的。
如果你想压缩内部空格并删除尾随空格,其中空格被纯粹地定义为字符集' ' , '\f' , '\n' , '\r' , '\t' , '\v'
(请参见re中的\s),你必须使用以下替换来进行分割:
import re
def squeeze(toks,p = re.compile(r'\s+')):
return ' '.join(x for x in p.split( toks ) if x)
或者,保留正确的子字符串:
import re
def squeeze(toks,p = re.compile(r'\S+')):
return ' '.join(p.findall(toks))
这实际上就是更简单和更快的表达式' '.join(toks.split())
但如果你只想压缩内部并删除尾随字符' '
和'\t'
,同时保留换行符不变,则可以使用
import re
def squeeze(toks,p = re.compile(r'[^ \t]+')):
return ' '.join(p.findall(toks))
而且这不能被其他任何东西所替代。
' '.join(test.split())
有问题吗?(其中test是你的字符串。) - Ulrich Schwarzsplit()
函数将在空格上进行分割,丢弃前导和尾随的空格,因此不会有空元素。 - Tim Pietzckers.split()
产生的列表(这也是 Ulrich 使用的方法)永远不包含空元素。 - John Machin