2011-10-20 60 views
11

我需要从一些文本文件中挑选一些数字。我可以用grep挑出需要的行,但不知道如何从行中提取数字。一位同事向我展示了如何从庆典用Perl做到这一点:Python相当于perl -pe?

cat results.txt | perl -pe 's/.+(\d\.\d+)\.\n/\1 /' 

不过,我通常代码在Python,Perl的不是。所以我的问题是,我可以用相同的方式使用Python吗?也就是说,我可以用bash把一些东西传给Python,然后直接将结果传给stdout? ......如果这是有道理的。或者Perl在这种情况下更方便?

+1

您可能会重新考虑,只是在python中进行所有解析。从python中进行猜测会非常容易。如果遇到问题,只需发表另一个问题:“我如何解析python中的这些行”,5分钟后,您将得到代码 – TJD

+0

@TJD:完全同意。 – heltonbiker

+0

@TJD:的确如此。我会考虑的。 – Nagel

回答

9

是的,你可以在命令行中使用Python。 python -c <stuff>将作为Python代码运行<stuff>。例如:

python -c "import sys; print sys.path" 

没有直接等同于-p选项为Perl(自动输入/输出线由行处理),但是这主要是因为Python不使用的$_相同的概念以及Perl所做的事情 - 在Python中,所有输入和输出都是手动完成的(通过raw_input()/input()print/print())。


为您具体的例子:(。显然,有些更笨拙的它可能会更好,只是写剧本做,在实际的Python)

cat results.txt | python -c "import re, sys; print ''.join(re.sub(r'.+(\d\.\d+)\.\n', r'\1 ', line) for line in sys.stdin)" 

+0

啊,谢谢!你是在我之前:) – Nagel

+0

奇怪的是,我使用的Python版本(2.7.1)似乎不喜欢在分号后内联'for for循环 - 简单的命令工作,但更复杂的结构抛出' SyntaxError'。 – duskwuff

+0

@duskwuff - 这是预期的。分号无法指定块。您可以改用理解/生成器表达式。 – Amber

2

您可以使用:

$ python -c '<your code here>' 
+0

感谢您的快速回复(对你和@Amber)!这几乎是我所期待的,但并不完全。这与perl -e类似,但它不会将输出打印到stdout。所以'python -c 2 + 2'什么都没有。 (你可以使用'python -c'a = 2 + 2;当然打印'',但你明白我的意思吗?) – Nagel

+0

@Nagel:所有的答案都是关于某些命令行方法的,但是你使用脚本吗? (用于阅读一堆文件,我肯定会使用脚本) – heltonbiker

0

您可以使用Python使用python -c直接从bash命令行执行代码,或者使用sys.stdin来处理输入到stdin的输入,请参阅here

1

理论上你可以,但是Python并没有像Perl那样接近任何正则表达式的魔法,所以得到的命令将会更加笨拙,特别是因为你不能使用正则表达式而不导入re(和你对于sys.stdin也可能需要sys)。

Python的相当于你同事的Perl的一个班轮大约是:

import sys, re 
for line in sys.stdin: 
    print re.sub(r'.+(\d\.\d+)\.\n', r'\1 ', line) 
+0

不应将导入标准模块视为“不纯”或其他不太健壮的代码,至少不要使用Python。 – heltonbiker

+0

谢谢!我很怀疑。猜猜我会学习一些基本的Perl这种任务然后:) – Nagel

+0

@heltonbiker当然有一个点,但生成的Python代码更长,似乎有点难以用作命令行工具。 – Nagel

1

您有哪些可以解决几个方面的问题。

我想你应该考虑直接从Python使用正则表达式(perl在你的例子中正在做什么)。正则表达式位于re模块中。一个例子是:

import re 
filecontent = open('somefile.txt').read() 
print re.findall('.+(\d\.\d+)\.$', filecontent) 

(我宁愿用$而不是“\ n”作为行结束,因为行尾操作系统和文件编码之间不同)

如果你想调用的bash命令来自Python内部,您可以使用:

import os 
os.system(mycommand) 

其中命令是bash命令。我一直使用它,因为有些操作在bash中比在Python中执行更好。

最后,如果要使用grep提取数字,请使用-o选项,该选项仅打印匹配的部分。

0

Perl(或sed)更方便。然而,如果丑陋,它是可能的:

python -c 'import sys, re; print "\n".join(re.sub(".+(\d\.\d+)\.\n","\1 ", l) for l in sys.stdin)'