替换python字符串中多个字符的出现(除了first和last)



我想知道用python实现以下功能的最简洁的方法是什么:

给定一个最小为2个','字符的字符串(例如,' abc,123,#$@5,dg')。我想创建一个新字符串,其中原始字符串中的第一个和最后一个','字符保持不变,但将','的其他出现替换为'_'字符。

以下是一些输入/输出示例:

输入:

str1 = 'abc,1,2201-3'
输出:

str2 = 'abc,1,2201-3'
输入:

str1 = '$2a$10$.XfjKl/,abcd, 1, ##, s, for free,2-3-4'
输出:

str2 = '$2a$10$.XfjKl/,abcd_ 1_ ##_ s_ for free,2-3-4'

一种方法是通过','字符将字符串拆分为列表,使用'_'连接列表的中间元素,然后使用第一个元素+ ',' +中间元素+ ',' +最后一个元素创建一个新字符串。是否有一种更简洁的方法来做到这一点(也许使用Regex)?

str1 = '$2a$10$.XfjKl/,abcd, 1, ##, s, for free,2-3-4'
parts = str1.split(',')
str2 = '{},{},{}'.format(parts[0],'_'.join(parts[1:-1]),parts[-1])

如果您正在寻找正则表达式的解决方案,请尝试:

    import re
    str1 = '$2a$10$.XfjKl/,abcd, 1, ##, s, for free,2-3-4'
    p=r'([^,]+,)(.*)(?=(,.*))'
    m=re.search(p,str1)
    r=''.join([m.group(1),re.sub(r',',r'_',m.group(2)),m.group(3)])
    print r

输出:str1 = '$2a$10$。XfjKl/,abcd, 1, ##, s, for free,2-3-4'

使用正则表达式将字符串分成三部分,然后使用re.sub()

将所有出现的','替换为'_'

先将所有点替换为行,然后将第一行和最后一行替换为点。

import re
line = '$2a$10$.XfjKl/,abcd, 1, ##, s, for free,2-3-4'
#replace all dot with line
pat_all_dot = re.compile(r',')
line = pat_all_dot.sub('_', line)
#replace first line with dot
line = re.sub(r'_', ',' ,line, count = 1)
#replace end line with dot
line = re.sub(r'(_)([S]*?)$', r',2', line) # '$2a$10$.XfjKl/,abcd_ 1_ ##_ s_ for free,2-3-4'

相关内容

最新更新