2011-10-20 59 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)'