这里非常直截了当的问题......我希望将我的正则表达式匹配添加到同一行,而不是文件中的新行。我以为我已经正确地完成了这项工作,但结果仍然是打印到新的一行:
结果:
1,2,BreakingBad,4,5,6...
,BreakingBad
我想要的是什么:
1,2,BreakingBad,4,5,6...,.BreakingBad
当前代码:
#!/usr/bin/env python
import re
import sys
file = open("/home/test", "r")
newfile = open("/home/testresults","w")
def regex():
#old_stdout = sys.stdout
#sys.stdout = newfile
lines = file.readlines()
for line in lines:
regex = re.search(r'(BreakingBad)',line)
if regex:
print line + "," + regex.group(1)
try:
regex()
finally:
file.close()
我在这里缺少什么?
答案 0 :(得分:3)
还有一些不过于Pythonic的东西,尽管它们更适合代码审查。
由于评论会变得太长,我只是把它作为答案。
要点:
使用with
上下文管理器。这为您节省了try ... finally
的麻烦,以确保文件在之后关闭。
不要将file
用作变量名称:它是一个保留的类名(对于文件对象,不能少)
不要使用全局变量:只需将文件名传递给regex()
函数
迭代文件对象。这样可以节省对readlines()
的调用,然后迭代这些行。迭代文件可以一次完成同样的事情。
此迭代还可以节省内存,因为它不会一次读取整个文件,而是逐行读取。有关详细信息,请参阅this post。
您不需要正则表达式来进行简单的单词搜索。通常,首先尝试避免使用正则表达式并查看存在的其他选项(str
有很多有用的方法)。
关于正则表达式的通常说法类似于
我有问题。我会尝试正则表达式。
...
现在我有两个问题
(here's one post on this topic。)
在这种情况下,一个简单的if word in sentence
形式可以解决问题。
这可以提供以下代码:
#!/usr/bin/env python
import sys
def run(filename):
with open(filename) as infile: # "r" mode is default
for line in lines:
if 'BreakingBad' in line:
print line.rstrip('\n') + "," + 'BreakingBad'
run("/home/test")
请注意,我明确地rstrip
ping换行符:如果您只使用rstrip()
,则会从右侧删除任何空格字符,包括空格和制表符。这可能是有意的,但问题并不清楚。
此外:由于你打开一个文件进行写作(但不要使用它,也就是说,它对你的问题不重要):你可以在with
语句中组合文件:
with open(filename) as infile, open(newfilename, "w") as outfile:
<whatever>
答案 1 :(得分:1)
该文件包含附加了换行符的字符串。 Python将其读作:
lines = '1,2,BreakingBad,4,5,6...\n'
因此当你连接时,字符串是:
1,2,BreakingBad,4,5,6...\n,BreakingBad
你真正想要的是删除换行符:
#!/usr/bin/env python
import re
import sys
file = open("/home/test", "r")
newfile = open("/home/testresults","w")
def regex():
#old_stdout = sys.stdout
#sys.stdout = newfile
lines = file.readlines()
for line in lines:
regex = re.search(r'(BreakingBad)',line)
if regex:
print line.strip() + "," + regex.group(1)
try:
regex()
finally:
file.close()
答案 2 :(得分:0)
从行中删除换行符:
print line.rstrip() + "," + regex.group(1)
您可能/也可能只使用切片,但这取决于行末尾是否有换行符:
print line[:-1] + "," + regex.group(1) #if ends with '\n'
我不会这样做,因为你必须完全知道每个文件是如何格式化的,如果在任何时候出现任何错误,你可能很难找到错误。