2014-10-03 3 views
0

Я знаю, что подобные вопросы существуют для этой темы, но я прошел через них и до сих пор не смог его получить.Замена частей строк в списке в Python

Моя программа python извлекает подраздел html со страницы, используя регулярное выражение. Я просто понял, что я не заметил, что специальные символы html мешают.

говорят, у меня есть:

regex_title = ['I went to the store', 'Itlt's a nice day today', 'I went home for a rest']

Я, очевидно, хотят изменить lt' в одинарные кавычки.

Я пробовал вариации:

for each in regex_title: 
    if 'lt'' in regex_title: 
     str.replace("lt'", "'") 

, но успеха не имел. Что мне не хватает.

ПРИМЕЧАНИЕ. Цель состоит в том, чтобы сделать это без импорта каких-либо дополнительных модулей.

+0

Это кажется странным для меня. unccaping, что html должен оставить вас с 'Itlt's', а не' It's' ... – mgilson

+1

Также обратите внимание, что [может быть лучший способ] (http://stackoverflow.com/a/2087433/748858) ... – mgilson

ответ

3

str.replace не заменяет на месте. Он возвращает замененную строку. Вам нужно вернуть возвращаемое значение.

>>> regex_title = ['I went to the store', 'Itlt's a nice day today', 
...    'I went home for a rest'] 
>>> regex_title = [s.replace("lt'", "'") for s in regex_title] 
>>> regex_title 
['I went to the store', "It's a nice day today", 'I went home for a rest'] 
+0

Отлично , Спасибо. Я не понимал, что должен переназначить переменную. – doxyl

1

Вы должны изменить свой код на этот:

for each in regex_title: 
    if 'lt'' in each: 
     each.replace("lt'", "'") 

Но это не меняет свой список поэтому вам необходимо пройти замененный индекс к списку:

>>> for each in regex_title: 
...   if 'lt'' in each: 
...    regex_title[regex_title.index(each)]=each.replace("lt'", "'") 
... 
>>> regex_title 
['I went to the store', "It's a nice day today", 'I went home for a rest'] 
>>> 
+0

Существует намного лучший способ сделать это, используя списки: 'new_list = [s.replace (" lt ' "," '") для s в old_list]'. Но, как я сказал в своем ответе, лучше использовать HTMLParser. – rmunn

+0

спасибо за напоминание, что знаю, что для этой цели существует много способов, но сначала я пытаюсь уточнить идею OP! то я добавлю другие способы! – Kasramvd

+0

Если вам нужны индексы, используйте 'enumerate'. Использование 'list.index' внутри цикла неэффективно. – falsetru

0

Вместо того, чтобы делать это самостоятельно, вам лучше использовать библиотеку HTMLParser, как описано в https://stackoverflow.com/a/2087433/2314532. Прочитайте этот вопрос и ответить на все детали, но краткое изложение:

import HTMLParser 
parser = HTMLParser.HTMLParser() 
print parser.unescape(''') 
# Will print a single ' character 

Так что в вашем случае, вы хотите сделать что-то вроде:

import HTMLParser 
parser = HTMLParser.HTMLParser() 
new_titles = [parser.unescape(s) for s in regex_title] 

Это будет любой экранирования в HTML побег, а не только побег ', о котором вы просили, и обрабатывать весь список сразу.

2

Если ваша задача состоит в том, чтобы HTML экранирования в, то лучше использовать unescape функцию:

>>> ll = ['I went to the store', 'Itlt's a nice day today', 'I went home for a rest'] 
>>> import HTMLParser 
>>> h = HTMLParser.HTMLParser() 
>>> print map(h.unescape, ll) 
['I went to the store', u"Itlt's a nice day today", 'I went home for a rest'] 
+0

+1 за рекомендацию 'map()' , Хотя я бы предположил, что понимание списком новичков Python, как представляется, похоже на OP, поскольку их синтаксис выглядит немного больше как цикл 'for', который его инстинкт будет толкать его писать. – rmunn

1

Вы не объясните, почему вы хотите, чтобы избежать импорта стандартных библиотечных модулей. Есть очень мало оснований отрицать, что вы используете батареи, включенные Python; если у вас нет такой причины (и если вы это сделаете, вы должны указать это), вы должны использовать предоставленные функции.

В этом случае, это unescape() функция от html модуля:

from html import unescape 

titles = [ 
    'I went to the store', 
    'It's a nice day today', 
    'I went home for a rest' 
] 

fixed = [unescape(s) for s in titles] 
>>> fixed 
['I went to the store', "It's a nice day today", 'I went home for a rest'] 

Переопределение html.unescape() себе является

  1. Бессмысленно.
  2. Ошибка.
  3. Постоянное возвращение и добавление новых случаев, когда в ваших данных появляются новые объекты HTML.

Так как Python 3.4, в любом случае. Для предыдущих версий используйте HTMLParser.HTMLParser.unescape() согласно @stalk's answer.

+0

Требовалось, чтобы проект не импортировал другие модули. Я уверен, что это будет полезно для кого-то в будущем, поэтому, вот и все. Приветствия. – doxyl

+0

Стоит отметить, что этот код предназначен для python3, а не для python2 (модуль 'html' находится только в python3) – stalk

+0

@stalk хорошая точка. Отредактировано :-) –

0

Попробуйте так: -

regex_title = ['I went to the store', 'Itlt's a nice day today', 'I went home for a rest'] 
str=','.join(regex_title) 
str1=str.replace("lt'","'");  
print str1.split() 
Смежные вопросы