2016-12-14 7 views
1

Я хочу разбить алфавитные символы (буквы) в строке запятыми, но у меня также есть алфавитные символы, которые я хочу сохранить.Python: вставить запятую после каждого алфавитного символа строки

Примеры (Input -> Желаемая выход):

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

Там может быть максимум один "-" перед данной буквы.

Моя первая попытка заключалась в использовании метода join, но она применима к любому символу строки, будь то буква или нет.

например. ','. join ("- ABC") дает «-, A, B, C», что не то, что я хочу

Любое предложение?

+0

Будет ли строка ввода заканчиваться символом, отличным от альфы? –

+0

В моем практическом случае это может произойти только в том случае, если строка состоит только из одного не-альфа-символа, например."-" – FLab

ответ

3

Сравнительное письма, но использовать отрицательный предпросмотр, чтобы исключить письмо в конце:

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' 
+0

Не нужно захватывать весь шаблон, поскольку вы всегда можете ссылаться на все значение соответствия с помощью 'r '\ g <0>'' –

+0

@ WiktorStribiżew: meh, вы либо вводите многословие в шаблон (групповой захват), либо в замену шаблон (использование «g» и угловых скобок). –

+1

Это не «многословие»: захват создает буфер памяти для подгрузки. –

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 
1

Это, вероятно, работа для регулярных выражений, но вы можете сделать это с .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,-' 

Я признаю, что [:-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)) 

выход

'ABC' -> 'A,B,C' 
'-ABC' -> '-A,B,C' 
'AB-C' -> 'A,B,-C' 
'A-BC-' -> 'A,-B,C,-' 

Хорошо, это, вероятно, kludgier, чем первая версия, но эй, это работает. :)

Как я уже говорил, замена регулярного выражения, вероятно, является разумным способом сделать это.

Смежные вопросы