2015-01-19 1 views
0

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

Это моя функция:

def tokenize(document): 
    file = open("document.txt","r+").read() 
    print re.findall(r'\w+', file) 

Входной текстовый файл имеет строку следующим образом:

What's did the little boy tell the game warden?  His dad was in the kitchen poaching eggs! 

Примечание: Там два интервала после надзирателя? и перед Его

Моя функция дает мне выход, как этот

['what','s','did','the','little','boy','tell','the','game','warden','His','dad','was','in','the','kitchen','poaching','eggs'] 

Желаемая выход:

[['what','s','did','the','little','boy','tell','the','game','warden'], 
['His','dad','was','in','the','kitchen','poaching','eggs']] 

ответ

0

В первый расколоть файл по пунктуации, а затем на втором проходе разделить приведенные строки по пространствам.

def splitByPunct(s): 
    return (x.group(0) for x in re.finditer(r'[^\.\,\?\!]+', s) if x and x.group(0)) 

[x.split() for x in splitByPunct("some string, another string! The phrase")] 

это дает

[['some', 'string'], ['another', 'string'], ['The', 'phrase']] 
+0

Как применить функцию split() в производном списке после первого прохода? можете ли вы написать этот модуль для меня, чтобы я мог понять .. – Wolf

0

Первый split весь текст на двойных пространств и затем пройти каждый элемент в regex как:

>>> file = "What's did the little boy tell the game warden? His dad was in the kitchen poaching eggs!" 
>>> file = text.split(' ') 
>>> file 
["What's did the little boy tell the game warden?", 'His dad was in the kitchen poaching eggs!'] 
>>> res = [] 
>>> for sen in file: 
... res.append(re.findall(r'\w+', sen)) 
... 
>>> res 
[['What', 's', 'did', 'the', 'little', 'boy', 'tell', 'the', 'game', 'warden'], ['His', 'dad', 'was', 'in', 'the', 'kitchen', 'poaching', 'eggs']] 
+0

спасибо :) Я получил логику – Wolf

0

Вот разумный подход все-Ре:

def tokenize(document): 
    with open("document.txt") as f: 
     text = f.read() 
    blocks = re.split(r'\s\s+', text) 
    return [re.findall(r'\w+', b) for b in blocks] 
+0

понял :) спасибо alex. отлично работает – Wolf

+0

Здесь лучше будет использовать генераторный подход. –

+0

@BurhanKhalid, считая, что многократные пробелы могут происходить в любом месте, чтение файла в блоках с соответствующим перекрытием было бы ужасно сложным - но это единственное потенциальное преимущество генератора, работа с файлами настолько огромным, что у вас недостаточно памяти, иначе , Так что «лучше» в глазах смотрящего - это очень сложная, подверженная ошибкам длинная функция, потенциально способная иметь дело с огромными файлами (которые никогда не указывались в Q) «лучше», чем простой, короткий, очевидно правильный? Кроме того, Q очень явно специфицировал ** списки ** как вывод, поэтому O (N) память в любом случае. –

0

Встроенная функция разделения позволяет разбивать на несколько пространств.

Это:

a = "hello world. How are you" 
b = a.split(' ') 
c = [ x.split(' ') for x in b ] 

Урожайность:

c = [['hello', 'world.'], ['how', 'are', 'you?']] 

Если вы хотите, чтобы удалить знаки препинания тоже применить регулярное выражение к элементам «Б» или «х» в третьем сообщении.

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