11
votes

Analyse SRT sous-titres

Je veux analyser les sous-titres SRT: xxx

chaque élément dans la structure. Avec cette regex:

A: xxx

b: xxx

et ce code: < / p> xxx

avec code bi n'a qu'un seul élément de matrice (à cause de gourmand. *) et avec le code AI ont vide 'text' à cause de gourmand. *?

Comment guérir cela?

merci


1 commentaires

Quand j'ai lu ceci, j'ai réalisé que j'avais fait cela auparavant, mais je ne me souvenais pas comment. Il s'avère que je l'ai fait de manière sur la procédure plutôt que d'utiliser une regex. La regex est assez élégante. Si vous êtes intéressé, la classe Python que j'ai utilisée avec des sous-titres SRT peut être trouvée à svn.jaraco.com/jaraco/python/jaraco.media/jaraco/media/srt.p y (Notez que" GRAPER "qu'il importe de Jaraco.util est Juste "mérou" de la documentation d'iTERTOOLS.


6 Réponses :


3
votes

Voici un certain code que j'avais couché pour analyser les fichiers SRT:

from __future__ import division

import datetime

class Srt_entry(object):
    def __init__(self, lines):
        def parsetime(string):
            hours, minutes, seconds = string.split(u':')
            hours = int(hours)
            minutes = int(minutes)
            seconds = float(u'.'.join(seconds.split(u',')))
            return datetime.timedelta(0, seconds, 0, 0, minutes, hours)
        self.index = int(lines[0])
        start, arrow, end = lines[1].split()
        self.start = parsetime(start)
        if arrow != u"-->":
            raise ValueError
        self.end = parsetime(end)
        self.lines = lines[2:]
        if not self.lines[-1]:
            del self.lines[-1]
    def __unicode__(self):
        def delta_to_string(d):
            hours = (d.days * 24) \
                    + (d.seconds // (60 * 60))
            minutes = (d.seconds // 60) % 60
            seconds = d.seconds % 60 + d.microseconds / 1000000
            return u','.join((u"%02d:%02d:%06.3f"
                              % (hours, minutes, seconds)).split(u'.'))
        return (unicode(self.index) + u'\n'
                + delta_to_string(self.start)
                + ' --> '
                + delta_to_string(self.end) + u'\n'
                + u''.join(self.lines))


srt_file = open("foo.srt")
entries = []
entry = []
for line in srt_file:
    if options.decode:
        line = line.decode(options.decode)
    if line == u'\n':
        entries.append(Srt_entry(entry))
        entry = []
    else:
        entry.append(line)
srt_file.close()


0 commentaires

21
votes

Pourquoi ne pas utiliser PYSRT ?


1 commentaires

Je ne le vois pas bien documenté.



9
votes

Le texte est suivi d'une ligne vide ou de la fin du fichier. Vous pouvez donc utiliser:

r' .... (?P<text>.*?)(\n\n|$)'


1 commentaires

+1 propre. Et pour rendre compte de WhitSpace, vous pouvez ajouter ... r '.... (? P . *?) \ N \ s * \ n'



3
votes
splits = [s.strip() for s in re.split(r'\n\s*\n', text) if s.strip()]
regex = re.compile(r'''(?P<index>\d+).*?(?P<start>\d{2}:\d{2}:\d{2},\d{3}) --> (?P<end>\d{2}:\d{2}:\d{2},\d{3})\s*.*?\s*(?P<text>.*)''', re.DOTALL)
for s in splits:
    r = regex.search(s)
    print r.groups()

0 commentaires

2
votes

Voici un extrait que j'ai écrit qui convertit les fichiers SRT en dictionnaires: xxx

utilisation: xxx


0 commentaires

14
votes

Je suis devenu assez frustré par les bibliothèques SRT disponibles pour Python (souvent parce qu'elles étaient des types de langues lourdes et éventuelles en faveur des classes personnalisées), donc j'ai passé la dernière année ou donc travailler sur ma propre bibliothèque SRT. Vous pouvez l'obtenir à https://github.com/cdown/srt .

J'ai essayé de Conservez-le simple et léger sur les classes (à l'exception de la classe de sous-titres principale, qui stocke plus ou moins les données du bloc SRT). Il peut lire et écrire des fichiers SRT et transformer les fichiers SRT non conforme à des fichiers SRT non configurés. P>

Voici un exemple d'utilisation avec votre exemple d'entrée: P>

>>> import srt, pprint
>>> gen = srt.parse('''\
... 1
... 00:00:12,815 --> 00:00:14,509
... Chlapi, jak to jde s
... těma pracovníma světlama?.
... 
... 2
... 00:00:14,815 --> 00:00:16,498
... Trochu je zesilujeme.
... 
... 3
... 00:00:16,934 --> 00:00:17,814
... Jo, sleduj.
... 
... ''')
>>> pprint.pprint(list(gen))
[Subtitle(start=datetime.timedelta(0, 12, 815000), end=datetime.timedelta(0, 14, 509000), index=1, proprietary='', content='Chlapi, jak to jde s\ntěma pracovníma světlama?.'),
 Subtitle(start=datetime.timedelta(0, 14, 815000), end=datetime.timedelta(0, 16, 498000), index=2, proprietary='', content='Trochu je zesilujeme.'),
 Subtitle(start=datetime.timedelta(0, 16, 934000), end=datetime.timedelta(0, 17, 814000), index=3, proprietary='', content='Jo, sleduj.')]


0 commentaires