2012-02-10 34 views
13

Tôi có khoảng 150 tệp văn bản chứa đầy thông tin ký tự. Mỗi tập tin chứa hai từ duy nhất() alpha và bravo và tôi muốn trích xuất văn bản giữa các từ duy nhất này và ghi nó vào một tệp khác.Cách trích xuất thông tin giữa hai từ duy nhất trong một tệp văn bản lớn

Thủ công tôi có thể CTRL + F cho hai từ và sao chép văn bản giữa, tôi chỉ muốn biết cách thực hiện việc này bằng chương trình (tốt nhất là Python) cho nhiều tệp.

Trả lời

27

Bạn có thể sử dụng regular expressions cho điều đó.

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

tập tin test.txt My

alpha here is my line 
yipee 
bravo 

Bây giờ sử dụng open để đọc các tập tin và hơn áp dụng 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: Đây là nơi biểu thức chính quy vượt trội. – jathanism

+0

-1 (1) x không được định nghĩa (2) module inputoutput ?? –

+0

@JohnMachin: sửa lỗi 'x'. – RanRag

2

Thay vì sử dụng cụm từ thông dụng, hãy sử dụng phương pháp 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

tôi có thay đổi gì nếu tôi có nhiều lần xuất hiện của từ duy nhất a và từ duy nhất b.Làm cách nào để tạo chỉ mục để tìm kiếm giữa lần xuất hiện thứ 5 của từ duy nhất a và từ duy nhất 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

Bạn có thể giúp chia nhỏ bằng cách thêm một số 1, do đó, nó sẽ ngừng tìm kiếm các trường hợp bổ sung để chia nhỏ: 'text.split (a, 1)' – PaulMcG

6

str.find và anh chị em của nó rfindstartend args.

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

Đây là cách nhanh nhất nếu văn bản được chứa ngắn và gần phía trước.

Nếu văn bản chứa là tương đối lớn, sử dụng:

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

Nếu văn bản chứa là ngắn và gần cuối, sử dụng:

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

Phương pháp đầu tiên là trong mọi trường hợp tốt hơn phương pháp ngây thơ bắt đầu tìm kiếm thứ hai từ đầu văn bản; sử dụng nó nếu văn bản của bạn có chứa không có mô hình chi phối.

Các vấn đề liên quan