在Python中使用正则表达式搜索并返回值

时间:2013-04-24 06:40:06

标签: python regex

我正在尝试编写一个程序来扫描视频,找到可用的音频和字幕语言,然后将这些结果用于输入。

目前,我正在生成输出:

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)

所以我需要找出日语前面的数字,但只有在“音轨”之后才会找到

同样,我需要找到英文前面的数字,但只有在“字幕轨道”之后才会找到

我很确定我需要使用正则表达式才能做到这一点,但我迷失在哪里开始。

3 个答案:

答案 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+替换空格以匹配一个或多个空格