2009-12-27 5 views

ответ

4
>>> import re 
>>> wordlist = ['Schreiben\nEs', 'Schreiben', \ 
    'Schreiben\nEventuell', 'Schreiben\nHaruki'] 
>>> [ re.sub("\n.*", "", word) for word in wordlist ] 
['Schreiben', 'Schreiben', 'Schreiben', 'Schreiben'] 

Совершено через re.sub:

>>> help(re.sub) 
    1 Help on function sub in module re: 
    2 
    3 sub(pattern, repl, string, count=0) 
    4  Return the string obtained by replacing the leftmost 
    5  non-overlapping occurrences of the pattern in string by the 
    6  replacement repl. repl can be either a string or a callable; 
    7  if a callable, it's passed the match object and must return 
    8  a replacement string to be used. 
+0

Я не уверен, но я думаю, что он также хочет, чтобы удалить последовательные символы после \ п – JCasso

+0

да, уже скорректированной .. – miku

+0

но я также хочу, чтобы удалить следующие буквы после \ n и ""! Еще раз спасибо – kame

1

Вы можете использовать регулярное выражение для этого:

import re 
wordlist = [re.sub("\n.*", "", word) for word in wordlist] 

Регулярное выражение \n.* совпадает с первым \n и все, что может (.*) и заменяет его на n ичто.

3
[w[:w.find('\n')] fow w in wordlist] 

несколько тестов:

$ python -m timeit -s "wordlist = ['Schreiben\nEs', 'Schreiben', 'Schreiben\nEventuell', 'Schreiben\nHaruki']" "[w[:w.find('\n')] for w in wordlist]" 
100000 loops, best of 3: 2.03 usec per loop 
$ python -m timeit -s "import re; wordlist = ['Schreiben\nEs', 'Schreiben', 'Schreiben\nEventuell', 'Schreiben\nHaruki']" "[re.sub('\n.*', '', w) for w in wordlist]" 
10000 loops, best of 3: 17.5 usec per loop 
$ python -m timeit -s "import re; RE = re.compile('\n.*'); wordlist = ['Schreiben\nEs', 'Schreiben', 'Schreiben\nEventuell', 'Schreiben\nHaruki']" "[RE.sub('', w) for w in wordlist]" 
100000 loops, best of 3: 6.76 usec per loop 

Edit:

Решение выше совершенно неверно (см комментарий от Peter Hansen). здесь скорректированная один:

def truncate(words, s): 
    for w in words: 
     i = w.find(s) 
     yield w[:i] if i != -1 else w 
+0

Какой невероятно плохой (т. Е. Полностью непроверенный) ответ, учитывая, что он спокойно обрезает слова, которые НЕ имеют в них новую строку. str.find() возвращает -1 в случае, когда нет совпадения, а нарезка с [: -1] возвращает все до, но не включая последний символ. Удалите. –

+0

@Peter Hansen: спасибо за ваш отчет, я думал, как сделать его одной линией для timeit, и я забыл о правильности. –

+0

@mg, ладно ... просто исправьте цикл for в отредактированной части сейчас, пожалуйста. «Для слов w:« имеет дополнительный «in». –

0
>>> wordlist = ['Schreiben\nEs', 'Schreiben', 'Schreiben\nEventuell', 'Schreiben\nHaruki'] 
>>> [ i.split("\n")[0] for i in wordlist ] 
['Schreiben', 'Schreiben', 'Schreiben', 'Schreiben']