我正在尝试编写一个程序来扫描视频,找到可用的音频和字幕语言,然后将这些结果用于输入。
目前,我正在生成输出:
with open('output.txt', 'wt') as output_f:
p = subprocess.Popen(command, stdout=output_f, stderr=output_f)
以下是我需要的扫描文本。
+ audio tracks:
+ 1, Japanese (aac) (2.0 ch) (iso639-2: jpn)
+ subtitle tracks:
+ 1, English (iso639-2: eng) (Text)(SSA)
所以我需要找出日语前面的数字,但只有在“音轨”之后才会找到
同样,我需要找到英文前面的数字,但只有在“字幕轨道”之后才会找到
我很确定我需要使用正则表达式才能做到这一点,但我迷失在哪里开始。
答案 0 :(得分:1)
你真的不需要正则表达式 - 无论如何,对我来说使用其中一个似乎太复杂了。
这是一些常规解析:
with open('output.txt', 'wt') as output_f:
parseTracks = False
lines = tuple(output_f)
for line in lines:
if 'audio tracks' in line:
parseTracks = True
if parseTracks:
if 'Japanese' in line:
theNumber = int(''.join([char for char in line if char in '1234567890']))
字幕也一样。
答案 1 :(得分:0)
这将起作用(与.findall()一起使用):
(?<=subtitle tracks:\n)\s+\+\s(\d+)
(?<=audio tracks:\n)\s+\+\s(\d+)
检查某个前缀(包括换行符),然后消耗空格并在“+”之后选择数字
答案 2 :(得分:0)
你可以这样做:
>>> import re
>>> audio_regex = re.compile(r'\+ audio tracks:\n\s*\+ (?P<number>\d+), (?P<lang>\w+)')
>>> subtitle_regex = re.compile(r'\+ subtitle tracks:\n\s*\+ (?P<number>\d+), (?P<lang>\w+)')
>>> text = '''
... + audio tracks:
... + 1, Japanese (aac) (2.0 ch) (iso639-2: jpn)
... + subtitle tracks:
... + 1, English (iso639-2: eng) (Text)(SSA)
... '''
>>> match = audio_regex.search(text) #find the first match
>>> match.group('number')
'1'
>>> match.group('lang')
'Japanese'
>>> audio_regex.findall(text) #find all matches
[('1', 'Japanese')]
>>> subtitle_regex.findall(text)
[('1', 'English')]
根据文件的格式调整上面的正则表达式或多或少是灵活的(例如,如果您可以使用更多空格代替单个空格,则可以用\s+
替换空格以匹配一个或多个空格