我正在尝试从原始输出中解析一些值,并且在使用正则表达式时遇到困难。原始字符串包含两个或多个具有相同“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)
答案 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']