繁体   English   中英

Python 相当于 perl -pe?

[英]Python equivalent to perl -pe?

我需要从一些文本文件中挑选一些数字。 我可以用 grep 挑选出我需要的行,但不知道如何从这些行中提取数字。 一位同事向我展示了如何使用 perl 从 bash 执行此操作:

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

但是,我通常用 Python 编写代码,而不是 Perl。 所以我的问题是,我可以以同样的方式使用 Python 吗? 即,我可以将某些东西从 bash 传送到 Python,然后将结果直接传送到 stdout 吗? ……如果有道理的话。 还是在这种情况下 Perl 更方便?

是的,您可以从命令行使用 Python。 python -c <stuff><stuff>作为 Python 代码运行。 例子:

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

没有直接等效于 Perl 的-p选项(自动输入/输出逐行处理),但这主要是因为 Python 没有使用与 Perl 相同的$_概念和其他东西 - 在Python,所有输入和输出都是手动完成的(通过raw_input() / input()print / print() )。


对于您的特定示例:

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

(显然有点笨拙。最好只编写脚本在实际的 Python 中完成它。)

您可以使用:

$ python -c '<your code here>'

理论上你可以,但 Python 没有 Perl 那样多的正则表达式魔法,所以生成的命令将更加笨拙,特别是因为你不能在不导入re情况下使用正则表达式(并且你可能需要sys适用于sys.stdin )。

你同事的 Perl one-liner 的 Python 等价物大约是:

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

您遇到了可以通过多种方式解决的问题。

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

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

(我更喜欢使用$而不是 '\\n' 作为行结尾,因为行结尾在操作系统和文件编码之间是不同的)

如果要从 Python 内部调用 bash 命令,可以使用:

import os
os.system(mycommand)

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

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

引自https://stackoverflow.com/a/12259852/411282

for ln in __import__("fileinput").input(): print ln.rstrip()

请参阅上面链接的解释,但这与perl -p作用相比要多得多,包括在未提供文件名时支持多个文件名和stdin

https://docs.python.org/3/library/fileinput.html#fileinput.input

您可以使用 python 直接从 bash 命令行执行代码,通过使用python -c ,或者您可以使用sys.stdin处理通过管道传输到 stdin 的输入,请参见此处

Perl(或 sed)更方便。 但是,如果丑陋,则有可能:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM