Je veux analyser les sous-titres SRT: chaque élément dans la structure. Avec cette regex: p> A: p> b: p> et ce code: < / p> avec code bi n'a qu'un seul élément de matrice (à cause de gourmand. *) et avec le code AI ont vide 'text' em> à cause de gourmand. *? p> Comment guérir cela? p> merci p> p> p>
6 Réponses :
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()
Le texte est suivi d'une ligne vide ou de la fin du fichier. Vous pouvez donc utiliser:
r' .... (?P<text>.*?)(\n\n|$)'
+1 propre. Et pour rendre compte de WhitSpace, vous pouvez ajouter ... r '.... (? P
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()
Voici un extrait que j'ai écrit qui convertit les fichiers SRT en dictionnaires: utilisation: p>
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.')]
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.