如何将一串句子重新格式化为每行一个句子Python

时间:2019-02-28 15:19:39

标签: python string split n-gram sentence

我有一个只是一个大字符串的文件。在此字符串中,有以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 :(得分:3)

使用正则表达式,您可以在每个模式出现后添加换行符(\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'

答案 1 :(得分:1)

您需要使用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)])

这将起作用,假设输入受问题中提供的字符串限制。如果否,则需要扩展模式。

答案 2 :(得分:0)

单形正则表达式应该做

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()

答案 3 :(得分:0)

下面的代码正在寻找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 = []

答案 4 :(得分:0)

此代码有效:

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'))

答案 5 :(得分:0)

要在列表中获取结果,可以使用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 ', '']