首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >折叠字符串中的连续字母数字字符

折叠字符串中的连续字母数字字符
EN

Stack Overflow用户
提问于 2015-09-11 16:14:37
回答 3查看 160关注 0票数 1

我想找到一种优雅而高效的方法,将所有连续出现的字母数字字符连在一起,在字符串中用空格分隔成单词。下面是我想要做的事情的一个例子:

代码语言:javascript
运行
复制
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'

这是我所使用的循环,但我相信有一些优雅的解决方案。

代码语言:javascript
运行
复制
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)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-11 16:25:57

下面是regex解决方案:

代码语言:javascript
运行
复制
>>> 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是一个单词边界,确保字母数字字符不后面/前面有另一个字符。

票数 3
EN

Stack Overflow用户

发布于 2015-09-11 16:37:19

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
     key=lambda x: len(x) == 1 and x.isalnum()
票数 2
EN

Stack Overflow用户

发布于 2015-09-11 16:26:58

这取决于你对优雅的定义。您可以迭代split的结果,构建长度为1到更大的项,并直接添加更长的项。

代码语言:javascript
运行
复制
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对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32527825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档