2016-08-12 22 views
0

私は未加工の出力からいくつかの値を解析しようとしており、正規表現では問題があります。生の文字列には、同じ 'start'キーワードを持つ2つ以上の値が含まれています。私は同じ「開始」と「終了」との間に2つ目のインスタンスを取得するにはどうすればよい文字列Aと文字列Bの2番目の出現の間の部分文字列のPython Regexクエリ

def parser(s, start, end): 
    try: 
     result = re.search('%s(.*)%s' % (start, end), s).group(1).strip() 
    except: 
     result = "" 
    print(result) 
    return result 

:これは私が私の最初のインスタンスを与える、これまで持っているものでしょうか?前もって感謝します!

例:

s = "verylongstring\n Name Server: IDNS1.NETSOL.COM\n Name Server: IDNS2.NETSOL.COM\n Status: clientTransferProhibited...." 
start = "Name Server: " 
end = "\n" 

所望の出力:

server1 = IDNS1.NETSOL.COM 
server2 = IDNS2.NETSOL.COM 

私はサーバー1を得ることができますが、ない2

server1 = parser(s, start, end) 
+0

を、あなたは例を提供することができますか? – rivu

+0

可能であれば、入力と予想出力を投稿してください –

答えて

2
s = "verylongstring\n Name Server: IDNS1.NETSOL.COM\n Name Server: IDNS2.NETSOL.COM\n Status: clientTransferProhibited...." 
start = "Name Server: " 
end = "\n" 
import re 
re.findall(start + "(.*?)" + end, s) 

出力は次のとおりです。

['IDNS1.NETSOL.COM', 'IDNS2.NETSOL.COM'] 

と機能は、このようにすることができます。同じsstartendため

def parser(s, start, end): 
    result = [l.strip() for l in re.findall(start + "(.*?)" + end, s)] 
    return result 

>>>parser(s, start, end) 
>>>['IDNS1.NETSOL.COM', 'IDNS2.NETSOL.COM'] 
1

これは、与えられた例で動作します。

def parser(s, start, end): 
    arr = [x.split(start)[1] for x in s.split('\n') if start in x] 
    return arr 
0

また、あなたの文字列の最後まで排出されるイテレータが作成されますre.finditerを利用することができます:

>>> import re 
>>> pat = re.compile(r'Name Server:(?P<Server_Name>.*?)\n') 
>>> 
>>> s 
'verylongstring\n Name Server: IDNS1.NETSOL.COM\n Name Server: IDNS2.NETSOL.COM\n Status: clientTransferProhibited....' 
>>> 
>>> 
>>> for match in pat.finditer(s): 
     print(match.group('Server_Name').strip()) 


IDNS1.NETSOL.COM 
IDNS2.NETSOL.COM 
>>> 
>>> [match.group('Server_Name').strip() for match in pat.finditer(s)] 
['IDNS1.NETSOL.COM', 'IDNS2.NETSOL.COM'] 
関連する問題