我想用逗号分隔字符串中的字母(字母),但我也想要保留非字母字符。
示例(输入 - >期望输出):
"ABC" -> "A,B,C"
"-ABC" -> "-A,B,C"
"AB-C" -> "A,B,-C"
最多可以有一个" - "在给定的信件之前。
我的第一次尝试是使用join方法,但它适用于字符串的任何字符,无论是否是字母。
e.g。 ',' .join(" -ABC")给出" - ,A,B,C"这不是我想要的
有什么建议吗?
答案 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