2015-08-28 8 views
1

Метод title() работает отлично, но у меня есть ситуация, когда есть строки, начинающиеся с слов и чисел, и я хочу только заголовок слова в строке, которая не начинается с цифр.Python: Есть ли сценарий с одной строкой для строк заголовка, за исключением строк, начинающихся с цифры?

Число чисел может быть переменным, и не всегда есть числа. Вот пример каждого случая.

"this is sparta".title() # This Is Sparta 

"3rd sparta this is".title() # 3Rd Sparta This Is 

"4545numbers start here".title() # "4545Numbers Start Here 

Я хотел бы, чтобы они вместо того, чтобы все это может быть изменено на:

"This Is Sparta" 

"3rd Sparta This Is" 

"4545numbers Start Here" 

Я использую программу, которая не позволяет импорт и мне нужно сделать это в одной строке. Единственная библиотека, которую я могу использовать, - re.

Мое предпочтение было бы использовать понимание списка, чтобы сделать это, если это возможно.

+0

Подождите, кто вниз проголосовала это ???/Почему ???? Почему почему почему – Startec

+0

Почему без импортера? Импорт стандартных библиотек, например re, должен быть уже в sys.modules. Попробуйте сделать импорт sys; sys.modules, чтобы понять, почему. –

+0

Я не уверен, почему. Я использую python во внешней программе, а не в специальном скрипте, поэтому я не могу использовать 'import'. Когда пытается использовать 'string', я получаю' NameError: "String не определен" ' – Startec

ответ

3

Вот простой список понимание:

' '.join([word.capitalize() for word in your_string.split(' ')]) 

Если вы хотите разделить на знаки препинания и другие пробелы, вы, вероятно, придется использовать какой-то re функции.

+0

Отмечу, что слово «0» .upper() + word [1:] 'не совсем эквивалентно« title ». Пример: '' ABCD '[0] .upper() +' ABCD '[1:] 'is' 'ABCD'', тогда как' 'ABCD'.title()' is '' Abcd''. Я * думаю * меняя слово [1:] 'на слово [1:]. Lower()' исправил бы его, но в этот момент вы можете вместо этого просто «загладить». – jpmc26

+0

Eh, решение 'string.capwords' лучше всего того, кто заботится, не так ли? :) EDIT: * ваше решение '' string.capwords' :) – mVChr

+0

Похоже, что OP указывает на изменения/комментарии, которые по какой-то причудливой причине у них возникают проблемы с импортом, поэтому ваш подход может быть в этом случае лучше , ;) – jpmc26

1

Это может быть другой вариант:

s = "3rd sparta this is" 
    " ".join([si.title() if not (str.isdigit(si[0])) else si for si in s.split()]) 
+0

На самом деле это именно то, что я хотел. – Startec

0

Просто установите первый символ в верхний регистр

string = string.split (' ') 
for x in range (len(string)): 
    try: 
     string[x] = string[x][0].uppercase() + string [x][1:] 
    except ValueError: 
     pass 
temp = '' 
for word in string: 
    temp += word + ' ' 
string = temp 
string.title() 
11

Как оказалось, уже есть функция, которая делает это, string.capwords:

>>> import string 
>>> string.capwords('1st foo bar bor1ng baz') 
'1st Foo Bar Bor1ng Baz' 
>>> string.capwords("3rd sparta this is") 
'3rd Sparta This Is' 

Остерегайтесь: пробелы пробелов будут свернуты int o одиночное пространство, а ведущее и завершающее пробелы будут удалены. Примечательно, что это означает, что вы потеряете разделители строк. Сначала вы должны разделить на строки, если хотите их сохранить.

Обратите внимание, что внутри он фактически использует метод capitalize вместо title, но это похоже на то, что вы хотите.

+1

TIL. Имейте upvote сэр. – rcoyner

+0

@rcoyner По иронии судьбы, я нашел его только потому, что искал документацию для 'split' для вашего ответа. лол – jpmc26

3

Regex solution.

In [19]: re.sub(r'\b(\w+)\b', lambda x: x.groups()[0].capitalize(), "3rd sparta this.is1", re.UNICODE) 
Out[19]: '3rd Sparta This.Is1' 

(см документацию по re.sub)

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

  • Нет связанных вопросов^_^