web-dev-qa-db-ja.com

大きなテキストファイルで2つの一意の単語間の情報を抽出する方法

文字情報が入った約150のテキストファイルがあります。各ファイルには2つの一意の単語()alphaとbravoが含まれています。これらの一意の単語の間のテキストを抽出して、別のファイルに書き込みます。

手動で2つの単語をCTRL + Fしてテキストをコピーできます。多くのファイルに対してプログラム(できればPython)を使用してこれを行う方法を知りたいだけです。

17
user2760

正規表現 を使用できます。

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

私のtest.txtファイル

alpha here is my line
yipee
bravo

現在 open を使用してファイルを読み取り、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 '
>>>
34
RanRag
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 '
11

str.findとその兄弟rfindにはstartend引数があります。

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

これは、含まれるテキストが短く、前面に近い場合、最も速い方法です。

含まれるテキストが比較的大きい場合は、以下を使用します。

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

含まれているテキストが短く、終わりに近い場合は、以下を使用します。

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

最初の方法は、テキストの最初から2番目の検索を開始する単純な方法よりも優れています。含まれているテキストに支配的なパターンがない場合に使用します。

7
John Machin

正規表現を使用する代わりに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
2
Aamir Adnan