我做了一些研究,但对我的情况没有任何效果。
我有这个正则表达式,我可以获得Stream#0:4但是我想重复这个规则并且还要捕获Stream#0:5。如何重复规则并忽略中间-> # 0: 0 (copy) -> # 0: 1 (copy)
正则表达式
/(?<=Stream mapping:)(\s+)([a-zA-Z])+(\s+)#([0-9]:[0-9])/s
文本
Metadata:
variant_bitrate : 800000
Stream mapping:
Stream #0:4 -> #0:0 (copy)
Stream #0:5 -> #0:1 (copy)
Press [q] to stop, [?] for help
我目前的结果
array(1) {
[0]=> array(5)
{
[0]=> string(15) " Stream #0:4"
[1]=> string(4) " "
[2]=> string(1) "m"
[3]=> string(1) " "
[4]=> string(3) "0:4" }
}
另一个问题是我的正则表达式正在治疗&#34; m&#34;作为单独的组合,包括空格。我该如何解决这个问题?
我想要一个像
这样的最终结果[0]Stream #0:4
[1]Stream #0:5
答案 0 :(得分:1)
您可以使用基于\G
运算符的自定义字边界:
$re = '/(?:\G(?!^)\s*|Stream mapping:\s*)\K([a-zA-Z]+\s+#[0-9]+:[0-9]+).*/';
$str = 'Metadata:
variant_bitrate : 800000
Stream mapping:
Stream #0:4 -> #0:0 (copy)
Stream #0:5 -> #0:1 (copy)
Press [q] to stop, [?] for help';
if (preg_match_all($re, $str, $m)) {
print_r($m[1]);
}
请参阅PHP demo。
模式细节:
(?:\G(?!^)\s*|Stream mapping:\s*)
- 上一场比赛结束,0 +空白字符或Stream mapping:
子字符串后跟0 +空格\K
- 匹配重置运算符,丢弃当前匹配的文本([a-zA-Z]+\s+#[0-9]+:[0-9]+)
- 第1组:1 + 1个字母,1 +个空格,#
,1 +位数,:
,1 +位数.*
- 行末尾的任何0 +字符(必须使用它,因为我们需要连续匹配)请参阅regex demo。
答案 1 :(得分:0)
为什么不简单
['0:4', '0:0', 'copy']
将匹配两次,
['0:5', '0:1', 'copy']
和(?<=Stream mapping:)
你对m
的支持是破坏你的方法的原因。我不认为这个输入真的需要它。
请注意,使用^
标记,print("{0:^40}".format(data_list[0]))
for i in range(1,len(data_list), 2):
name1 = data_list[i]
name2 = data_list[i+1]
print("{0:<20}{1:>20}\n".format(name1, name2))
匹配每行,这在此处很有用。