Как переформатировать строку предложений в одно предложение на строку Python - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть файл, который представляет собой одну большую строку.В этой строке есть предложения, которые заканчиваются 3 числами, например так:

видит мышь.1980 1 1 овца эритроциты мыши 1980 6 5 видели мышь 1980 8 8

Я хочу изменить это так, чтобы файл / вывод выглядел так:

видит мышь.1980 1 1

мышиные эритроциты овцы 1980 6 5

мышиные мыши 1980 8 8

Вот код, который я использовал, чтобы попытаться решить эту проблему:

with open('ngram_test') as f:
for line in f:
    #print(line)
    for word in line.split():
        print(word)

Это, однако, печатает только каждое слово в строке и новую строку.Любая помощь будет принята с благодарностью!

Ответы [ 6 ]

0 голосов
/ 28 февраля 2019

Чтобы получить результаты в виде списка, вы можете использовать re.split ().

Из re встроенная библиотека.

>>> import re

>>> with open(ngram_test) as f:
...    s = f.read()

>>> splitted = re.split(r"r"\d*\s\d\s\d"", s)

>>> splitted
>>> ['sees mouse . ', ' sheep erythrocytes mouse ', ' seen mouse ', '']
0 голосов
/ 28 февраля 2019

Этот код работает:

import re  
print(re.sub(r'(\d{4} \d{1,2} \d{1,2} )', r'\1\n', 'sees
mouse . 1980 1 1 sheep erythrocytes mouse 1980 6 5 seen mouse 1980 8
8'))
0 голосов
/ 28 февраля 2019

В приведенном ниже коде выполняется поиск последовательности из 3 чисел.
Обратите внимание, что это решение начального уровня и не включает регулярные выражения.

def is_int(value):
    try:
        int(value)
        return True
    except ValueError:
        return False


with open('54928944.txt', 'r') as f:
    numbers_counter = 0
    one_line_words = []
    line = f.read()
    words = line.split(' ')
    for word in words:
        if is_int(word):
            numbers_counter += 1
        else:
            numbers_counter = 0
        one_line_words.append(word)
        if numbers_counter == 3:
            print(' '.join(one_line_words))
            one_line_words = []
0 голосов
/ 28 февраля 2019

Симплексное регулярное выражение должно делать

a='sees mouse . 1980 1 1 sheep erythrocytes mouse 1980 6 5 seen mouse 1980 8 8'
count=0
for i in re.finditer('(\d \d \d)',a):
    print(a[count:i.end()].strip())
    count=i.end()
0 голосов
/ 28 февраля 2019

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

import re

pattern = re.compile(r'[a-zA-Z\.\s]+\d{4}\s+?\d{1,2}\s+?\d{1,2}')
print([(m.start(0), m.end(0)) for m in re.finditer(pattern, s)])

Это будет работать при условии, что ввод ограничен строками, указанными в вопросе.Если нет, вам необходимо расширить шаблон.

0 голосов
/ 28 февраля 2019

Используя Regex, вы можете добавлять новую строку (\n) после каждого вхождения шаблона:

import re
s = "sees mouse . 1980 1 1 sheep erythrocytes mouse 1980 6 5 seen mouse 1980 8 8"
pattern = r"(\d{4}\s\d{1,2}\s\d{1,2})"
for match in re.findall(pattern, s):
    s = re.sub(match, f'{match}\n', s)

Вывод:

'sees mouse . 1980 1 1\n sheep erythrocytes mouse 1980 6 5\n seen mouse 1980 8 8\n'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...