2013-03-15 2 views
1

Я пытаюсь сделать первую букву каждой строки верхнего корпуспервых букв каждой строки с помощью regrex

Я использую следующее регулярное выражение

ModCon = re.sub('^[a-z]{1}', lambda x: x.upper(), ModCon) 

ничего не происходит, когда я запускаю программу ...

+0

И что ваш * ввод * тогда? Он содержит новые строки? –

+0

@MartijnPieters да, это так .. это файл с двумя строками на данный момент, я должен удалить все двойные пробелы для одиночной и заглавной буквы каждой буквы в начале каждой строки –

+0

Обратите внимание, что '{1}' is * always * бесполезная конструкция. 'НИЧЕГО {1}' всегда совпадает с 'НИЧЕГО'. – 2013-03-15 11:26:56

ответ

2

Клемма ^ соответствует только началу ввода строки ввода. Если вы хотите, чтобы соответствовать после каждой строки, вы должны дать ему флаг re.M или re.MULTILINE тоже:

ModCon = re.sub('^[a-z]', lambda x: x.group().upper(), ModCon, flags=re.M) 

Я удалил {1} часть; он неявный, без индикатора повторения набор символов соответствует только один символ.

Функция замены передается Match object, поэтому вам нужно вытащить согласованную строку, вызвав метод .group().

+0

Я получаю сообщение об ошибке, которое, я думаю, касается функции upper, я представляю функцию правильно? –

+1

@HayaRaed: Ах, нет. Объект соответствия передается, а не соответствующая строка. Обновлено. –

+0

, поэтому группа функций() группирует соответствие в строку? –

1

Переменная x в функции лямбда не является строкой типа, но является < типа '_sre.SRE_Match' >. Чтобы получить совпадающую строку, вам необходимо указать call x.group().

Таким образом (также с помощью подсказок в других ответов), следующий скрипт работает отлично:

import re 
ModCon= "what is your favorite color?\nred" 
ModCon = re.sub('^[a-z]', lambda x: x.group().upper(), ModCon, flags=re.M) 
print (ModCon) 
Смежные вопросы