2012-02-10 8 views
13

Tengo alrededor de 150 archivos de texto rellenos con información de caracteres. Cada archivo contiene dos palabras únicas() alfa y bravo y quiero extraer el texto entre estas palabras únicas y escribirlo en un archivo diferente.Cómo extraer información entre dos palabras únicas en un archivo de texto grande

Manualmente puedo presionar CTRL + F para las dos palabras y copiar el texto entre, solo quiero saber cómo hacer esto usando un programa (preferiblemente Python) para muchos archivos.

Respuesta

27

Puede usar regular expressions para eso.

>>> st = "alpha here is my text bravo" 
>>> import re 
>>> re.findall(r'alpha(.*?)bravo',st) 
[' here is my text '] 

Mi archivo test.txt

alpha here is my line 
yipee 
bravo 

Ahora, utilizando open para leer el archivo y que la aplicación de regular expressions.

>>> f = open('test.txt','r') 
>>> data = f.read() 
>>> x = re.findall(r'alpha(.*?)bravo',data,re.DOTALL) 
>>> x 
[' here is my line\nyipee\n'] 
>>> "".join(x).replace('\n',' ') 
' here is my line yipee ' 
>>> 
+1

+1: Aquí es donde sobresalen las expresiones regulares. – jathanism

+0

-1 (1) x no está definido (2) módulo inputoutput ?? –

+0

@JohnMachin: solucionó el problema de 'x'. – RanRag

2

En lugar de usar la expresión regular, utilice el método Python string.find.

>>>> unique_word_a = 'alpha' 
>>>> unique_word_b = 'bravo' 
>>>> s = 'blah blah alpha i am a good boy bravo blah blah' 
>>>> your_string = s[s.find(unique_word_a)+len(unique_word_a):s.find(unique_word_b)].strip() 
i am a good boy 
+1

qué cambios hago si tengo varias ocurrencias de palabras únicas ay palabras únicas b. ¿Cómo creo un índice para buscar entre la 5ta ocurrencia de la palabra única ay la única palabra b? – Amistad

9
a = 'alpha' 
b = 'bravo' 
text = 'from alpha all the way to bravo and beyond.' 

text.split(a)[-1].split(b)[0] 
# ' all the way to ' 
+3

Puede ayudar a dividir agregando un conteo de 1, por lo que dejará de buscar instancias adicionales para dividir: 'text.split (a, 1)' – PaulMcG

6

str.find y su hermano tienen rfindstart y end args.

alpha = 'qawsed' 
bravo = 'azsxdc' 
startpos = text.find(alpha) + len(alpha) 
endpos = text.find(bravo, startpos) 
do_something_with(text[startpos:endpos] 

Esta es la manera más rápida si el texto que contiene es corto y cerca del frente.

Si el texto contenido es relativamente grande, utilice:

startpos = text.find(alpha) + len(alpha) 
endpos = text.rfind(bravo) 

Si el texto que figura es corto y cerca del final, el uso:

endpos = text.rfind(bravo) 
startpos = text.rfind(alpha, 0, endpos - len(alpha)) + len(alpha) 

El primer método es, en cualquier caso mejor que el método ingenuo de comenzar la segunda búsqueda desde el comienzo del texto; Úselo si su texto contenido no tiene un patrón dominante.

Cuestiones relacionadas