Python 单行提取字段的方法
输入:
$ ./ffmpeg -i test020.3gp
ffmpeg version UNKNOWN, Copyright (c) 2000-2011 the FFmpeg developers
built on May 5 2011 14:30:25 with gcc 4.4.3
configuration:
libavutil 51. 2. 0 / 51. 2. 0
libavcodec 53. 3. 0 / 53. 3. 0
libavformat 53. 0. 3 / 53. 0. 3
libavdevice 53. 0. 0 / 53. 0. 0
libavfilter 2. 4. 0 / 2. 4. 0
libswscale 0. 14. 0 / 0. 14. 0
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test020.3gp':
Metadata:
major_brand : 3gp4
minor_version : 512
compatible_brands: 3gp4
creation_time : 2004-07-01 09:59:21
Duration: 00:01:02.20, start: 0.000000, bitrate: 284 kb/s
Stream #0.0(und): Audio: aac, 44100 Hz, stereo, s16, 96 kb/s
Metadata:
creation_time : 2004-07-01 09:59:21
Stream #0.1(und): Video: mpeg4, yuv420p, 176x120 [PAR 1:1 DAR 22:15], 184 kb/s, 15 fps, 15 tbr, 30k tbn, 15 tbc
Metadata:
creation_time : 2004-07-01 09:59:23
At least one output file must be specified
假设我想用下面这个正则表达式来提取宽度和高度:
(\d+x\d+)
在perl中,我会这样做:
$ ./ffmpeg -i test020.3gp 2>&1 | perl -lane 'print $1 if /(\d+x\d+)/'
176x120
然后我尝试构建一个类似的python单行代码,它有点能用,但不是完全正确:
$ ./ffmpeg -i test020.3gp 2>&1 | python -c "import sys,re;[sys.stdout.write(str(re.findall(r'(\d+x\d+)', line))) for line in sys.stdin]"
[][][][][][][][][][][][][][][][][][][]['176x120'][][][]
那么,和perl对应的python单行代码应该是什么样的呢?
3 个回答
2
我正在开发一个模块,目的是让写Python的一行代码变得更轻松。你可以把它想象成Ruby和Perl中的一些选项,比如-n
、-e
、-l
和-p
,但是是为Python准备的。
$ pip install oneliner
# use as pyl-$major-$minor <args> or python -m oneliner <args>
$ pyl-2.7 -j -ne 're.findall("\d+x\d+", line)' < ffmpeg.txt
3
在编程中,有时候我们需要让程序在特定的条件下执行某些操作。比如说,当用户点击一个按钮时,程序就会做出反应。这种情况通常会用到“事件”这个概念。
事件就像是程序中的一个信号,告诉程序发生了什么事情。比如,用户点击了鼠标、按下了键盘,或者页面加载完成等。程序可以“监听”这些事件,并在事件发生时执行相应的代码。
为了让程序能够处理这些事件,我们需要写一些代码来定义这些操作。这就像是给程序设定了一些规则,告诉它在特定情况下应该做什么。
总之,事件处理是让程序与用户互动的重要部分。通过合理地使用事件,程序可以变得更加灵活和智能。
cat sample.txt | python -c "import sys,re; print '\n'.join(re.findall(r'(\d+x\d+)',sys.stdin.read()))"
176x120
5
你想要的是 re.search
而不是 re.findall
。
这样做就能解决问题,虽然这行代码看起来有点“丑”(/tmp/p
只是你提供的示例数据):
% cat /tmp/p 2>&1 | python -c "import re,sys; print re.search(r'(\d+x\d+)', sys.stdin.read()).group()"
176x120
你有没有考虑直接使用 grep
(在这种情况下是 egrep
)呢?
% cat /tmp/p | egrep -o '[0-9]+x[0-9]+'
176x120