2012-02-10 14 views
13

Mam około 150 plików tekstowych wypełnionych informacjami o znakach. Każdy plik zawiera dwa unikalne słowa() alfa i bravo i chcę wyodrębnić tekst między tymi unikalnymi słowami i zapisać je w innym pliku.Jak wyodrębnić informacje między dwoma unikalnymi słowami w dużym pliku tekstowym

Ręcznie mogę CTRL + F dla dwóch słów i skopiować tekst między, chcę tylko wiedzieć, jak to zrobić za pomocą programu (najlepiej Python) dla wielu plików.

Odpowiedz

27

Można do tego użyć regular expressions.

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

Mój plik test.txt

alpha here is my line 
yipee 
bravo 

Teraz używając open odczytać pliku i nie stosowanie 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: Tu właśnie wypadają wyrażenia regularne. – jathanism

+0

-1 (1) x nie jest zdefiniowany (2) moduł inputoutput ?? –

+0

@JohnMachin: naprawiono rzecz 'x'. – RanRag

2

Zamiast używać wyrażeń regularnych, należy użyć metody 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

jakie zmiany mam, jeśli mam wiele wystąpień unikalnego słowa ai unikalnego słowa b.Jak utworzyć indeks do wyszukiwania między 5 wystąpieniem unikalnego słowa a i unikatowym słowem 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

Możesz pomóc podzielić przez dodanie liczby 1, więc przestanie szukać dodatkowych instancji do podziału na: 'text.split (a, 1)' – PaulMcG

6

str.find i jego rodzeństwo rfind mieć start i end args.

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

Jest to najszybszy sposób, jeśli zawarty tekst jest krótki i znajduje się blisko przodu.

Jeśli zawierał tekst jest stosunkowo duża, należy:

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

Jeśli zawierał tekst jest krótki i zbliża się do końca, przeznaczenie:

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

Pierwsza metoda jest w każdym razie lepiej niż naiwna metoda rozpoczynania drugiego wyszukiwania od początku tekstu; użyj go, jeśli twój zawarty tekst nie ma dominującego wzorca.

Powiązane problemy