我有一个只是一个大字符串的文件。在此字符串中,有以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)
但是,这仅打印字符串和换行符中的每个单词。任何帮助将不胜感激!
答案 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 ', '']