我有下一个代码,它从多个文件中读取,解析获取的行并打印结果:
import os
import re
files=[]
pars=[]
for i in os.listdir('path_to_dir_with_files'):
files.append(i)
for f in files:
with open('path_to_dir_with_files'+str(f), 'r') as a:
pars.append(re.sub('someword=|\,.*|\#.*','',a.read()))
for k in pars:
print k
但我在输出中有多个新行有问题:
test1
test2
而不是它我想要在输出中没有空行的情况下获得下一个结果:
test1
test2
等等。
我尝试使用regexp:
pars.append(re.sub('someword=|\,.*|\#.*|^\n$','',a.read()))
但它不起作用。我也尝试使用strip()和rstrip()包括替换。它也不起作用。
你可以帮忙吗?答案 0 :(得分:6)
您可以使用第二个正则表达式用一个新行替换多个新行,并使用strip去除最后一个新行。
import os
import re
files=[]
pars=[]
for i in os.listdir('path_to_dir_with_files'):
files.append(i)
for f in files:
with open('path_to_dir_with_files/'+str(f), 'r') as a:
word = re.sub(r'someword=|\,.*|\#.*','', a.read())
word = re.sub(r'\n+', '\n', word).strip()
pars.append(word)
for k in pars:
print k
答案 1 :(得分:1)
在不改变代码的情况下,一种简单的方法就是在打印之前检查线条是否为空,例如:
import os
import re
files=[]
pars=[]
for i in os.listdir('path_to_dir_with_files'):
files.append(i)
for f in files:
with open('path_to_dir_with_files'+str(f), 'r') as a:
pars.append(re.sub('someword=|\,.*|\#.*','',a.read()))
for k in pars:
if not k.strip() == "":
print k
***编辑 由于pars中的每个元素实际上都是文件的整个内容(而不仅仅是一行),因此您需要更换任何双端行,最简单的方法是重做
import os
import re
files=[]
pars=[]
for i in os.listdir('path_to_dir_with_files'):
files.append(i)
for f in files:
with open('path_to_dir_with_files'+str(f), 'r') as a:
pars.append(re.sub('someword=|\,.*|\#.*','',a.read()))
for k in pars:
k = re.sub(r"\n+", "\n", k)
if not k.strip() == "":
print k
请注意,这并不考虑文件以换行符结尾而下一行以一行开头的情况 - 如果您担心需要添加额外的逻辑来处理它或更改你在
中阅读数据的方式答案 2 :(得分:-1)
仅想指出:regexes不是处理该问题的最佳方法。在Python str中将两个空行替换为一个非常简单,无需重新输入:
id,name,category,status,country
1,XXX,ABC,Active,USA
1,XXX,DEF,Active,HKG
1,XXX,XYZ,Active,USA
瞧!比re快得多,而且(在我看来)阅读起来更容易。