2017-10-01 1 views
0

1 ont un format de texte qui ressemble à cet exempletranscription de l'analyse avec expression régulière

PAUL: carottes lorem ipsum de, améliorer l'environnement écologique. Jasmine pratique> besoins réservés.

LEONARD: masse de jasmin. Lorsque Rays Super Bowl Poignées> Montagnes instantanément. Jusqu'à ce que le football, ultricies, nutrition> football, le prix d'un, de la salade. Il n'y a pas de recette pour la masse. Jusqu'à ce que le pied « et triées par pas de bananes, bœuf fonctionnel, bon marché.

mal Ninja [sur le toit] Dans la thérapie, comme CNN, la coiffure, stérilisées> thérapie de la vie. pied ces doux prix du gaz de relais de football. Les développeurs entier. > Protéines de demain. Si pas toujours à l'élément. Nunc région déductible. > Lion réservés jasmin, de prêts, milieu de vie, et le Japon, par exemple.

Paul [CRIE]: La dernière lorem la protéine dans, tirer un feugiat> Produit.

et une expression régulière pour analyser les relevés de notes dans les boîtes de dialogue.

[A-Z]+([:]|[ ]{1}[[][A-Z]*[]]) 

1 essaie de capturer tous les locuteurs de telle sorte que l'expression régulière correspond

"PAUL:", 
"LEONARD [some context]:" 

Comme vous pouvez le voir here 1 n'ont pas été en mesure de capturer tous les Facebook.

mal Ninja [sur le toit]:

1: Comment saisir ci-dessus ainsi? Regex est même la bonne façon de faire pour cela?

Modifier tous le nom des haut-parleurs sont en majuscules, et se termine par deux points. Ceci est le format dans lequel toutes les transcriptions que je suis face.

+0

Est-ce que tous les dialogues commencent par le nom du haut-parleur en majuscules? Et se termine par un colon? – ShreyasG

+0

Oui. Je vais modifier la question pour la rendre plus claire. – maximegir

+0

Est-ce que cela doit être regex, car il existe de bien meilleurs moyens de le faire dans la plupart des langages de programmation. –

Répondre

3

Le problème avec votre regex est qu'il ne permet pas des espaces, il ne correspond pas à « Evil Ninja » ou « sur le toit. »

Mais oui, regex est absolument la bonne façon de le faire. Vous pouvez essayer ceci:

([A-Z][A-Z ]*)(?: \[([\w ]+)\])?: 

Utilisation

regex = r'([A-Z][A-Z ]*)(?: \[([\w ]+)\])?:' 

for match in re.finditer(regex, text): 
    print('person:', match.group(1)) 
    print('context:', match.group(2)) 
    print() 

Sortie:

person: PAUL 
context: None 

person: LEONARD 
context: None 

person: EVIL NINJA 
context: on the roof 

person: PAUL 
context: SCREAMING 
+0

Merci pour la réponse. Y a-t-il un moyen pour moi d'obtenir le texte après le match? Un peu comme obtenir le texte de l'orateur, en fait. – maximegir

+0

@maximegir Oui, mais cela dépend du format de votre texte. Par exemple, s'il n'y aura jamais de saut de ligne dans le texte, vous pouvez simplement ajouter '(. *)' À l'expression régulière. –

0
[A-Z ]+(:|\[[a-zA-Z ]+\]:) 

1 pense que ce que vous avez tort était que vous ne correspond pas à des lettres minuscules dans la la années [], donc [on the roof] ne correspondent pas. 1 a-z've ajouté à la classe de caractères et maintenant il correspond. En outre, vous n'avez pas laissé un espace blanc au nom du personnage, de sorte que le début de [A-Z ] 1've changé.

try it here!

0

regex

"^([A-Z\s]+)(?:\[(?:[\w ]+)\])?:(.*?)$" 
  • A-Z peut être modifiée pour \w
  • Pour obtenir le contexte (?:[\w ]+) devrait être remplacé ([\w ]+)

Code

import re 

regex = r"^([A-Z\s]+)(?:\[(?:[\w ]+)\])?:(.*?)$" 

test_str = ("PAUL: Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. \n\n" 
     "LEONARD: Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. \n\n" 
     "EVIL NINJA [on the roof]: In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. \n\n" 
     "PAUL [SCREAMING]: Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. ") 

matches = re.finditer(regex, test_str, re.MULTILINE) 

for matchNum, match in enumerate(matches): 
    matchNum = matchNum + 1 

    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group())) 

    for groupNum in range(0, len(match.groups())): 
     groupNum = groupNum + 1 

     print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum))) 

sortie

Match 1 was found at 0-100: PAUL: Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.  
Group 1 found at 0-4: PAUL 
Group 2 found at 5-97: Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. 

Match 2 was found at 100-381: LEONARD: Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. 
Group 1 found at 100-107: LEONARD 
Group 2 found at 108-378: Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. 

Match 3 was found at 381-684: EVIL NINJA [on the roof]: In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim.  
Group 1 found at 381-392: EVIL NINJA 
Group 2 found at 406-681: In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. 

Match 4 was found at 684-767: PAUL [SCREAMING]: Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. 
Group 1 found at 684-689: PAUL 
Group 2 found at 701-767: Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus.