Python Regex查询第二次出​​现的字符串A和字符串B之间的子字符串

时间:2016-08-12 02:16:50

标签: python regex string parsing

我正在尝试从原始输出中解析一些值,并且在使用正则表达式时遇到困难。原始字符串包含两个或多个具有相同“start”关键字的值。这就是我到目前为止所给出的第一个实例:

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

我可以获得server1,但不能获得2。

server1 = parser(s, start, end)

3 个答案:

答案 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']

,功能可以是这样的:

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

对于相同的s start end

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

答案 1 :(得分:1)

这适用于给定的例子。

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

答案 2 :(得分: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']