2016-01-29 1 views
0
text = 'the text stuff <*to test*> to find a way to extract all text'\ 
     'that is <*included in special tags*> less than star and greater'\ 
     'than star' 

J'ai essayé d'utiliser: Adding up re.finditer results.Tentative d'extraction de texte dans les balises <* mot mot mot *> n fois dans chaque ligne via Python

J'ai essayé plusieurs combinaisons d'importation regex. J'ai essayé des variantes de \w+.

Je peux imprimer du texte avec '<* .... *>' et remplacer '<*' et '*>' par des blancs à l'aide .replace, mais je ne peux pas utiliser DictReader pour extraire uniquement les mots dans les balises, car les balises semblent être des caractères spéciaux en Python. En utilisant le DictReader, je tire toute la ligne de texte, mais pas seulement avec des mots dans les balises de caractères de contrôle.

.split fonctionne sur le texte pour remplacer, mais pas pour trouver du texte dans une balise avec des caractères inhabituels tels que <*...*>.

J'ai essayé d'échapper aux personnages <, * et > comme dans \<|*.*?+\*\> pour trouver tout le texte dans les balises ou marqueurs, mais cela ne fonctionne pas.

Python n'aime pas que ces caractères soient échappés.

J'ai pensé à les trouver dans des balises octales pour <, * et > mais cela peut être une distorsion du fonctionnement de Python.

Nous avons trouvé de bons conseils tirés des livres de Wes McKinney et de Beazley/Jones sur Python.

Avoir testé le texte de début et de fin, mais ces caractères spéciaux ne se substituent pas bien. S'excuser d'avance pour la complexité des solutions essayées.

J'espère que je suis dans le stade pour l'approche.

  1. importation et inscrivez-vous csv

    csv.register_dialect('piper', delimiter = '|', quoting=csv.QUOTE_NONE) 
    
  2. utilisent un DictReader pour lire chaque ligne

    with open('text') as csvfle: 
        for row in csv.DictReader(csvfile, dialect='piper'): 
         row["specialtext"] = row["text"].replace("<*", "").replace("*>",   "").decode('windows-1252').encode('utf-8').strip() 
         print row['specialtext'] 
    

tous ces travaux ci-dessus, mais toute tentative de trouver le texte dans la tags, n'a pas.

+0

REGEX est mauvais à ce sujet. vous avez besoin d'un analyseur simple. –

+0

@Chad S. ... des suggestions? – MethodyM

+0

modgrammar est un .. mais il y a en fait [beaucoup de choix] (https://wiki.python.org/moin/LanguageParsing) –

Répondre

1

Pensez à utiliser re.findall() pour extraire tout texte correspondant dans une liste et pour tous les caractères spéciaux (comme astérisque, *) échapper à la barre oblique inverse:

import re 

text = 'the text stuff <*to test*> to find a way to extract all text'\ 
     'that is <*included in special tags*> less than star and greater'\ 
     'than star' 

txtsearch = re.findall('<\*(.*?)\*>', text) 

if txtsearch: 
    print(txtsearch) 

# ['to test', 'included in special tags'] 
+0

bon code; élégant; simple; fonctionne bien. Je vous remercie. – MethodyM