質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Q&A

解決済

2回答

1766閲覧

ファイルの中から特定の文字列の抽出

tasss

総合スコア12

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

0グッド

0クリップ

投稿2017/01/31 17:33

ダンプデータの中から、”abcd"という文字を発見したら、”xyz”という文字を見つけるまで、そこの間の文字を抽出し、ファイルに出力したいのですが、どのようなソースコードを書けばよいか教えてください。

ダンプデータの中には、抽出したい文字の集合は複数あります。
つまり、
abcd(......
...... ←この括弧の中をファイルに出力したい(実際に括弧はないです)
......)xyz
.....
.....
.....
abcd(...
.....
.....
.....)xyz
.....
という感じです。(わかりずらくてすみません)

ファイルの読み込みは一行ずつ読み込むようにしたいです。

よろしくお願いします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

行毎に処理する例です。
意外と手強いですね。

Python

1class Unwrap(object): 2 ''' 3 複数行にまたがる囲み「<-~->」を取り除く 4 ''' 5 def __init__(self, stMark="<-", edMark="->"): 6 7 self.__stMark = stMark # 開始、終了記号 8 self.__edMark = edMark 9 self.__stLen = len(stMark) 10 self.__edLen = len(edMark) 11 12 self.__curLv = 0 # 現在の囲みレベル 13 self.__strBuf = "" # 囲み内の文字列保持用バッファ 14 15 self.__initLine("") 16 17 def __initLine( self,str): 18 ''' 19 1行文字列をセット 20 ''' 21 22 self.__lineStr = str # 走査対象の文字列 23 self.__lenLine = len(str) 24 25 self.__state = "" # 行の走査状態 「囲み開始」など 26 self.__curPos = 0 # 走査文字位置 27 self.__markPos = -1 # 開始or終了記号の文字位置 28 29 self.__bufPos = 0 # バッファへの文字列取得位置 30 31 def __moveNext(self): 32 ''' 33 文字列を次の位置まで走査 34 ''' 35 36 # 開始、終了記号を探す 37 stPos = self.__lineStr.find( self.__stMark, self.__curPos) 38 edPos = self.__lineStr.find( self.__edMark, self.__curPos) 39 40 self.__state = "end" # 行末 41 self.__curPos = -1 42 self.__markPos = -1 43 44 lenMark = -1 45 if stPos >= 0 and edPos >= 0: 46 47 if stPos < edPos: 48 self.__state = "st" # 囲み開始 49 else: 50 self.__state = "ed" # 囲み終了 51 52 elif stPos >= 0: 53 self.__state = "st" 54 elif edPos >= 0: 55 self.__state = "ed" 56 57 if self.__state == "st": 58 self.__markPos = stPos 59 lenMark = self.__stLen 60 elif self.__state == "ed": 61 self.__markPos = edPos 62 lenMark = self.__edLen 63 64 self.__curPos = self.__markPos + lenMark 65 if self.__curPos >= self.__lenLine: 66 self.__curPos = -1 67 68 def unwrapLine(self, lineStr): 69 ''' 70 1行分の結果を返す 71 ''' 72 73 self.__initLine( lineStr) 74 aRet = [] 75 while True: 76 self.__moveNext() 77 78 if self.__curLv == 0: # 囲みなし 79 80 if self.__state == "st": 81 self.__curLv += 1 82 self.__bufPos = self.__curPos 83 84 else: # 囲み中 85 86 if self.__state == "ed": 87 88 self.__curLv -= 1 89 90 if self.__curLv == 0: # 囲み完全に終了 91 92 if self.__bufPos >= 0: # 取得残を取り込む 93 self.__strBuf += self.__lineStr[self.__bufPos:self.__markPos] 94 95 aRet.append(self.__strBuf) 96 97 self.__bufPos = 0 98 self.__strBuf = "" 99 100 elif self.__state == "st": # 囲み開始 101 self.__curLv += 1 102 103 if self.__state == "end": # 「行末」 104 if self.__curLv > 0 and self.__bufPos >= 0: # 取得残を取り込む 105 self.__strBuf += self.__lineStr[self.__bufPos:] 106 break 107 108 return aRet 109 110def unwrap( aLine): 111 ul = Unwrap() 112 aRet = [] 113 for line in aLine: 114 aOne = ul.unwrapLine( line) 115 aRet += aOne 116 return aRet 117 118print( unwrap(["<-abc-><-de","f-><-g<-h->->"]))

投稿2017/02/01 09:38

can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tasss

2017/02/01 19:21

回答ありがとうございます。 説明も添えていただき、とてもわかりやすかったです。 ほんとに初歩的な質問だと思いますが、ファイルの読み込みの手順もご説明していただけないでしょうか。 zipファイルを解凍して、そのファイルの中身を抽出したいです。 付け足しになってしまい、申し訳ありません。
can110

2017/02/02 01:14

ファイル読込、zip解凍ともに検索すれば多くのサンプルが見つかります。 まずはやってみて、分からない場合は新たに質問してはいかがでしょうか。
guest

0

Pythonであれば、正規表現を用いるのが一番かと思われます。

python

1import re 2 3# abcdeとxyzの間を取得する。 4text = "abcde00000000000000000000xyz" 5 6# A-Za-z0-9の文字を抽出(記号等は含まれない) 7result = re.search(r'abcde(?P<data>[A-Za-z0-9].*)xyz', text) 8 9# 条件にマッチしたデータの表示 10print result.group('data') 11

こんな感じでしょうかね。一度試して見てください。正規表現の方法はいくつかあるので、自分のものに合わせて書き換えて見てくださいね

投稿2017/02/01 01:22

black_sleepman

総合スコア220

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問