ダンプデータの中から、”abcd"という文字を発見したら、”xyz”という文字を見つけるまで、そこの間の文字を抽出し、ファイルに出力したいのですが、どのようなソースコードを書けばよいか教えてください。
ダンプデータの中には、抽出したい文字の集合は複数あります。
つまり、
abcd(......
...... ←この括弧の中をファイルに出力したい(実際に括弧はないです)
......)xyz
.....
.....
.....
abcd(...
.....
.....
.....)xyz
.....
という感じです。(わかりずらくてすみません)
ファイルの読み込みは一行ずつ読み込むようにしたいです。
よろしくお願いします
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア38262
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
総合スコア220
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/01 19:21
2017/02/02 01:14