2014-02-15 6 views
0

Так что дайте список, например.Изменение элемента в списке

lines = ['This', 'is', 'a', 'sentence.'] 

Мне нужно удалить все знаки препинания в начале и конце слова. В этом случае '.' от «предложения».

Это то, что я использую в данный момент:

lines = line.strip().split() 
for l in lines: 
    l = re.sub(r'^[^A-Za-z0-9]*|[^A-Za-z0-9]*$','', l) 
words.append(lines) 

Я знаю, что регулярное выражение работает (через проверки его с помощью print(l) в цикле), но когда я распечатать строки (т.е. из цикл), пунктуация все еще существует! Что не так с моим кодом.

Это то, что должно быть добавлено к словам:

lines = ['This', 'is', 'a', 'sentence'] 
+2

'l' просто указывает на некоторую строку в' lines'. Когда вы пишете 'l = ...', все, что вы делаете, это изменение, на которое указывает 'l', оставляя базовый объект неизменным (строки неизменны в любом случае, поэтому вы не можете их изменить). Вы должны изменить фактический объект списка с помощью 'lines [index] = ...' или создать новый список. – Blender

ответ

2

Вы должны поместить обработанный текст обратно в список; строки неизменяемы, их нельзя изменить на месте. Например:

for i, l in enumerate(lines): 
    lines[i] = re.sub(r'^[^A-Za-z0-9]*|[^A-Za-z0-9]*$','', l) 

или список версия понимание:

lines = [re.sub(r'^[^A-Za-z0-9]*|[^A-Za-z0-9]*$','', l) for l in lines] 
+0

Не могу сказать, что я могу рекомендовать regex здесь. Кажется, он просто лишает пунктуацию от начала и конца слов, и в этом случае почему бы не использовать 'string.strip'? –

+0

Это не имеет ничего общего с изменчивостью/неизменностью элементов, но тем, что Блендер объяснил в своем комментарии. Если вы пишете '' li = [[45,12], ['a', 'b']]; для l в li: l = l + [1000] '' объект, на который ссылается '' li'', останется прежним, т. е. его элементы остаются теми же. - Кстати, чтобы сохранить идентификатор '' lines'' привязан к одному и тому же объекту (id est с тем же адресом), нужно написать '' lines [:] = expression'' – eyquem

1

Это кажется глупо ... Почему мы используем регулярное выражение для этого?

import string 
lines = [word.strip(string.punctuation) for word in line.split()] 
+0

См. «Line.split()» в вашем списке comp, объекты списка не имеют split(). – cheekybastard

+0

'line' не является списком в соответствии с исходным вопросом' lines = line.strip(). Split() ' –

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