2015-05-08 7 views
0

Я пытаюсь написать простую программу, которая удаляет все слова, содержащие цифры из полученной строки.Удаление слов, содержащих цифры из заданной строки

Вот моя текущая реализация:

import re 

def checkio(text): 

    text = text.replace(",", " ").replace(".", " ") .replace("!", " ").replace("?", " ").lower() 
    counter = 0 
    words = text.split() 

    print words 

    for each in words: 
     if bool(re.search(r'\d', each)): 
      words.remove(each) 

    print words 

checkio("1a4 4ad, d89dfsfaj.") 

Однако, когда я выполнить эту программу, я получаю следующий результат:

['1a4', '4ad', 'd89dfsfaj'] 
['4ad'] 

Я не могу понять, почему '4ad' печатается в вторая строка, поскольку она содержит цифры и должна быть удалена из списка. Есть идеи?

+0

Добавить свой ожидаемый результат тоже –

+1

Вы изменяете список во время итерации по нему. См. Этот вопрос, почему вы не должны этого делать: http://stackoverflow.com/questions/10812272/modifying-a-list-while-iterating-over-it-why-not – bgporter

+1

Что именно вы пытаетесь выполнить? Каковы ваши ограничения и условия? –

ответ

0

Предполагая, что ваше регулярное выражение делает то, что вы хотите, вы можете сделать это, чтобы избежать удаления во время итерации.

import re 

def checkio(text): 

    text = re.sub('[,\.\?\!]', ' ', text).lower() 
    words = [w for w in text.split() if not re.search(r'\d', w)] 
    print words ## prints [] in this case 

Также обратите внимание, что я упростил вашу линию text = text.replace(...).

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

import re 

def checkio(text): 

    words = [w for w in re.split('[,.?!]', text.lower()) if w and not re.search(r'\d', w)] 
    print words ## prints [] in this case 
-1

Таким образом, очевидно, что происходит одновременная ошибка доступа. А именно - вы удаляете элемент при перемещении массива.

На первой итерации у нас есть слова = ['1a4', '4ad', 'd89dfsfaj']. Поскольку «1a4» имеет номер, мы удаляем его. Теперь слова = ['4ad', 'd89dfsfaj']. Однако на второй итерации текущее слово теперь «d89dfsfaj», и мы удаляем его. Что происходит, так это то, что мы пропускаем «4ad», потому что теперь он находится в индексе 0, а текущий указатель для цикла for равен 1.

+0

нет, нет. –

+0

Согласовано это не –

+0

re.search возвращает объект re.MatchObject –

0

Если вы тестируете буквенные числовые строки, почему бы не использовать isalnum() вместо регулярного выражения?

In [1695]: x = ['1a4', '4ad', 'd89dfsfaj'] 

In [1696]: [word for word in x if not word.isalnum()] 
Out[1696]: [] 
0

Это возможно за счет использования re.sub, re.search и list_comprehension.

>>> import re 
>>> def checkio(s): 
     print([i for i in re.sub(r'[.,!?]', '', s.lower()).split() if not re.search(r'\d', i)]) 


>>> checkio("1a4 4ad, d89dfsfaj.") 
[] 
>>> checkio("1a4 ?ad, d89dfsfaj.") 
['ad'] 
Смежные вопросы