【问题标题】:Regular expression search for *Stream #0:0(und): Video:* or *Stream #0:0: Audio* in output python3.5正则表达式搜索 *Stream #0:0(und): Video:* or *Stream #0:0: Audio* in output python3.5
【发布时间】:2017-11-14 20:45:51
【问题描述】:

我正在尝试解析如下所示的 输出

b"Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '../abc/def/vid.mp4':\n  Metadata:\n    major_brand     : isom\n    minor_version   : 512\n    compat
ible_brands: isomiso2avc1mp41\n    encoder         : Lavf56.40.101\n  Duration: 00:03:40.36, start: 0.000000, bitrate: 445 kb/s\n    Stream #0:0(und): Video: h264 (Main) (avc1 /
 0x31637661), yuv420p, 480x360 [SAR 1:1 DAR 4:3], 311 kb/s, 29.92 fps, 29.92 tbr, 90k tbn, 59.83 tbc (default)\n    Metadata:\n      handler_name    : VideoHandler\n    Stream #
0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 125 kb/s (default)\n    Metadata:\n      handler_name    : SoundHandler\nOutput #0, null, to 'pipe:':\n  M
etadata:\n    major_brand     : isom\n    minor_version   : 512\n    compatible_brands: isomiso2avc1mp41\n    encoder         : Lavf56.40.101\n    Stream #0:0(und): Video: rawvi
deo (I420 / 0x30323449), yuv420p, 480x360 [SAR 1:1 DAR 4:3], q=2-31, 200 kb/s, 29.92 fps, 29.92 tbn, 29.92 tbc (default)\n    Metadata:\n      handler_name    : VideoHandler\n
    encoder         : Lavc56.60.100 rawvideo\n    Stream #0:1(und): Audio: pcm_s16le, 44100 Hz, stereo, s16, 1411 kb/s (default)\n    Metadata:\n      handler_name    : SoundHan
dler\n      encoder         : Lavc56.60.100 pcm_s16le\nStream mapping:\n  Stream #0:0 -> #0:0 (h264 (native) -> rawvideo (native))\n  Stream #0:1 -> #0:1 (aac (native) -> pcm_s1
6le (native))\nPress [q] to stop, [?] for help\n[null @ 0x7af4c0] Encoder did not produce proper pts, making some up.\nframe= 1434 fps=0.0 q=-0.0 size=N/A time=00:00:48.06 bitra
te=N/A    \rframe= 2718 fps=2715 q=-0.0 size=N/A time=00:01:30.97 bitrate=N/A    \rframe= 4183 fps=2785 q=-0.0 size=N/A time=00:02:19.94 bitrate=N/A    \rframe= 5494 fps=2743 q=
-0.0 size=N/A time=00:03:03.78 bitrate=N/A    \rframe= 6590 fps=2765 q=-0.0 Lsize=N/A time=00:03:40.35 bitrate=N/A    \nvideo:618kB audio:37960kB subtitle:0kB other streams:0kB
global headers:0kB muxing overhead: unknown\n"

我想在这个中找到一个pattern,它的开始看起来像这样:

Stream #0:0(und): Video:

或者像这样的模式

Stream #0:0: Audio:

所以,我在 python3.5 中尝试了这个正则表达式:

re.search("^\s*Stream[\s.]*:\s(Video|Audio)[\s.]*", data)

由于输出(需要解析)是字节字符串,我已经使用output.decode("utf-8") 进行了转换。 但是,re.search(...) 的输出是 None,所以这不是在 output 中找到 pattern 的正确正则表达式吗?

【问题讨论】:

标签: regex python-3.5


【解决方案1】:

[\s.]* 匹配 0 个或多个 .(点)或空格(\s)字符。

此外,您需要实际获取它们之后的文本,因此您需要一个点匹配模式,该模式可以跨行匹配到下一个“关键字”或字符串结尾。

所以,我建议

(?m)^\s*Stream.*?(?:Audio|Video):\s*([\s\S]*?)(?=^\s*Metadata:|\Z)

regex demo

详情

  • (?m) - re.M 内联修饰符
  • ^ - 行的开始
  • \s* - 0+ 个空格
  • Stream - 文字字符串
  • .*? - 除换行符以外的任何 0+ 字符,尽可能少, 直到第一个...
  • (?:Audio|Video): - Audio:Video:
  • \s* - 0+ 个空格
  • ([\s\S]*?) - 任何 0+ 个字符,尽可能少,直到第一个...
  • (?=^\s*Metadata:|\Z) - 两种选择之一:
    • ^\s*Metadata: - 行首、空格和Metadata: 子字符串
    • | - 或
    • \Z - 字符串的最后。

使用说明:如果您使用re.findall 运行它,您只能获得与([\s\S]*?) 匹配的文本。

【讨论】:

  • 谢谢,这行得通,尽管我只尝试了你答案的(?m)^\s*Stream.*?(?:Audio|Video):\s* 的这一部分,这对我也很有效。接受这个作为答案。
  • 好的,很高兴我能帮助您弄清楚您需要什么。下次请考虑添加至少 1 个预期结果的示例。
猜你喜欢
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 2016-01-03
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
相关资源
最近更新 更多