Python:在字符串

时间:2016-12-14 12:18:46

标签: python regex string

我想用逗号分隔字符串中的字母(字母),但我也想要保留非字母字符。

示例(输入 - >期望输出):

"ABC" -> "A,B,C"
"-ABC" -> "-A,B,C"
"AB-C" -> "A,B,-C"

最多可以有一个" - "在给定的信件之前。

我的第一次尝试是使用join方法,但它适用于字符串的任何字符,无论是否是字母。

e.g。 ',' .join(" -ABC")给出" - ,A,B,C"这不是我想要的

有什么建议吗?

4 个答案:

答案 0 :(得分:7)

匹配这些字母,但使用否定前瞻来排除最后的字母:

re.sub(r'([A-Z])(?!$)', r'\1,', inputstring)

参见online demo at regex101.com,这个Python会话:

>>> import re
>>> re.sub(r'([A-Z])(?!$)', r'\1,', 'ABC')
'A,B,C'
>>> re.sub(r'([A-Z])(?!$)', r'\1,', '-ABC')
'-A,B,C'
>>> re.sub(r'([A-Z])(?!$)', r'\1,', 'AB-C')
'A,B,-C'

答案 1 :(得分:1)

这可能是正则表达式的一项工作,但你可以使用 DROP TABLE dbo.Table1 DECLARE @colsPivot AS NVARCHAR(MAX), @colsUnpivot AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) select @colsPivot = STUFF((SELECT ',' + QUOTENAME(rce.EcoDate) from PhdRpt.RptCaseEco_542 AS rce group by rce.EcoDate order by rce.EcoDate FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'') SELECT @colsUnpivot = stuff((SELECT ','+quotename(C.name) FROM sys.columns AS C WHERE C.object_id = object_id('PhdRpt.RptCaseEco_542') AND C.name in ('NDCash', 'DCash')--LIKE '%Cash' or C.Name like 'NetGas' FOR xml path('')), 1, 1, '') set @query = 'select * into dbo.Table1 from ( SELECT ReportRunCaseId, col, EcoDate, val FROM PhdRpt.RptCaseEco_542 unpivot ( val for col in ('+ @colsunpivot +') ) u ) x1 pivot ( max(val) for EcoDate in ('+ @colspivot +') ) p' exec(@query) 来完成它,你只需要使用列表理解和测试。

如果输入字符串永远不会以非字母字符结尾,您可以这样做:

.join

<强>输出

data = ("ABC", "-ABC", "AB-C")
for s in data:
    t = ''.join([c + ',' if c.isalpha() else c for c in s])[:-1]
    print('{!r}\t-> {!r}'.format(s, t))

我承认'ABC' -> 'A,B,C' '-ABC' -> '-A,B,C' 'AB-C-' -> 'A,B,-C,-' 有点笨拙,但它可能比对每个字符进行索引检查更有效,看看它是否在字符串的末尾。< / p>

如果输入字符串可以以非字母字符结尾,我们可以这样做:

[:-1]

<强>输出

data = ("ABC", "-ABC", "AB-C", "A-BC-")
for s in data:
    t = ''.join([c + ',' if c.isalpha() else c for c in s[:-1]] + [s[-1]])
    print('{!r}\t-> {!r}'.format(s, t))

好吧,它可能比第一个版本更糟糕,但是嘿,它有效。 :)

正如我之前所说,正则表达式替换可能是理所当然的。

答案 2 :(得分:1)

我知道这是旧帖子,但不是:

','.join('AB-C').replace('-,','-')

>>> A,B,-C

更轻松?

答案 3 :(得分:0)

isalpha是一个可以在任何string对象上调用的函数,它将返回bool值以检查是否为字母。

def split_char(s):
    final = []
    temp = ''
    for i in s:
        if i.isalpha():
            final.append(temp+i)
            temp = ''
        else:
            temp = temp + i

    return final

print split_char('-ABC')

>>>['-A', 'B', 'C']

temp_list = split_char('AB-C')
print ','.join(temp_list)

>>> A,B,-C