我想找到一种优雅而高效的方法,将所有连续出现的字母数字字符连在一起,在字符串中用空格分隔成单词。下面是我想要做的事情的一个例子:
a = 'a b c zzz a yyy a 2 xxx 2 3 wwww a c'Desired_result = 'abc zzz a yyy a2 xxx 23 wwww ac'
这是我所使用的循环,但我相信有一些优雅的解决方案。
def myFunc(instring):
b,result = instring.split(),''
for i,row in enumerate(b):
if i==0:
result = row
else:
if len(row) == 1 and len(b[i-1]) == 1 and \
row.isalnum() and b[i-1].isalnum():
result = result + row
else:
result = result + ' ' + row
else:
return result
a = 'a b c zzz a yyy a 2 xxx 2 3 wwww a c'
print myFunc(a)
a_punct = '! @ 23 xxx cv abd $ abcd a c #'
print myFunc(a_punct)发布于 2015-09-11 16:25:57
下面是regex解决方案:
>>> a = 'a b c zzz a yyy a 2 xxx 2 3 wwww a c'
>>> re.sub(r'(?<=\b\w)\s+(?=\w\b)', '', a)
'abc zzz a yyy a2 xxx 23 wwww ac'它移除任何空格(\s+),其前面是单个字母数字字符((?<=\b\w)),后面是单个字母数字字符((?=\w\b))。\w是字母数字字符或下划线(将其替换为仅用于字母数字的[a-zA-Z0-9] ),而\b是一个单词边界,确保字母数字字符不后面/前面有另一个字符。
发布于 2015-09-11 16:37:19
from itertools import groupby
print(" ".join(["".join(v) if k == 1 else " ".join(v)
for k, v in groupby(a.split(), key=len)]))
abc zzz a yyy a2 xxx 23 wwww ac如果您实际上可以使用非单个字母数字字符(您自己的代码没有检查这些字符),则可以使用lambda:
key=lambda x: len(x) == 1 and x.isalnum()发布于 2015-09-11 16:26:58
这取决于你对优雅的定义。您可以迭代split的结果,构建长度为1到更大的项,并直接添加更长的项。
current_item = []
result = []
for item in instring.split():
if len(item) == 1:
current_item.append(item)
elif len(item) > 1 and current_item:
result.append("".join(current_item))
current_item = []
result.append(item)
else:
result.append(item)
if current_item:
result.append("".join(current_item))
print " ".join(result)通过将项目创建为列表并在最后加入它们,您可以避免很多字符串连接,这在python中是非常低效率的。由于字符串是不可变的对象,每次使用与+运算符连接的字符串时,都会在内存中创建新的字符串,并将两个原始字符串的内容复制到其中。
另一方面,列表的大小可以动态更改,您只需在结束时创建一次string对象。
https://stackoverflow.com/questions/32527825
复制相似问题