re.findall 在 python 中的列表中
re.findall within a list in python
我有如下列表。
sample_text = ['199.72.81.55 -- [01/Jul/1995:00:00:01 -0400] "Get /histpry/appollo/HTTP/1.0" 200 6245',
'unicomp6.unicomp.net -- [01/Jul/1995:00:00:06 -0400] "Get /shuttle/countdown/HTTP/1.0" 200 3985',
'199.120.110.21 -- [01/Jul/1995:00:00:01 -0400] "Get /histpry/appollo/HTTP/1.0" 200 6245',
'burger.letters.com -- [01/Jul/1995:00:00:06 -0400] "Get /shuttle/countdown/HTTP/1.0" 200 3985',
'205.172.11.25 -- [01/Jul/1995:00:00:01 -0400] "Get /histpry/appollo/HTTP/1.0" 200 6245']
我需要获取列表中的所有主机名。预期结果如下。
['199.72.81.55', 'unicomp6.unicomp.net', '199.120.110.21', 'burger.letters.com', '205.172.11.25']
我的代码是:
for i in range(0, len(sample_text)):
s=sample_text[i]
host.append(re.findall('[\d]*[.][\d]*[.][\d]*[.][\d]*|[a-z0-9]*[.][a-z]*[.][a-z]*', s))
print(host)
我的输出:
[['199.72.81.55'], ['unicomp6.unicomp.net'], ['199.120.110.21'], ['burger.letters.com'], ['205.172.11.25']]
我该如何解决这个问题?
如果不使用正则表达式,您可以 str.split
on '--'
并完成第一部分
>>> [i.split('--')[0].strip() for i in sample_text]
['199.72.81.55', 'unicomp6.unicomp.net', '199.120.110.21', 'burger.letters.com', '205.172.11.25']
类似的想法,但使用正则表达式
>>> import re
>>> [re.match(r'(.*) -- .*', i).group(1) for i in sample_text]
['199.72.81.55', 'unicomp6.unicomp.net', '199.120.110.21', 'burger.letters.com', '205.172.11.25']
在这两种情况下,您都可以使用列表理解来替换您的 for
循环
也许试试这样的事情:
sum(host, [])
你可以很容易地压平host
:
host = []
for i in range(0, len(sample_text)):
s=sample_text[i]
host += re.findall('[\d]*[.][\d]*[.][\d]*[.][\d]*|[a-z0-9]*[.][a-z]*[.][a-z]*', s)
print(host)
输出:
['199.72.81.55', 'unicomp6.unicomp.net', '199.120.110.21', 'burger.letters.com', '205.172.11.25']
re.findall()
returns 字符串列表。
文档:https://docs.python.org/3/library/re.html#re.findall
.append
会将列表作为单个项目添加到新列表中。
尝试:
host.extend(
我只是使用 .extend 而不是 append 解决了这个问题。
host.extend(re.findall('[\d]*[.][\d]*[.][\d]*[.][\d]*|[a-z0-9]*[.][a-z]*
[.][a-z]*', s))
我有如下列表。
sample_text = ['199.72.81.55 -- [01/Jul/1995:00:00:01 -0400] "Get /histpry/appollo/HTTP/1.0" 200 6245',
'unicomp6.unicomp.net -- [01/Jul/1995:00:00:06 -0400] "Get /shuttle/countdown/HTTP/1.0" 200 3985',
'199.120.110.21 -- [01/Jul/1995:00:00:01 -0400] "Get /histpry/appollo/HTTP/1.0" 200 6245',
'burger.letters.com -- [01/Jul/1995:00:00:06 -0400] "Get /shuttle/countdown/HTTP/1.0" 200 3985',
'205.172.11.25 -- [01/Jul/1995:00:00:01 -0400] "Get /histpry/appollo/HTTP/1.0" 200 6245']
我需要获取列表中的所有主机名。预期结果如下。
['199.72.81.55', 'unicomp6.unicomp.net', '199.120.110.21', 'burger.letters.com', '205.172.11.25']
我的代码是:
for i in range(0, len(sample_text)):
s=sample_text[i]
host.append(re.findall('[\d]*[.][\d]*[.][\d]*[.][\d]*|[a-z0-9]*[.][a-z]*[.][a-z]*', s))
print(host)
我的输出:
[['199.72.81.55'], ['unicomp6.unicomp.net'], ['199.120.110.21'], ['burger.letters.com'], ['205.172.11.25']]
我该如何解决这个问题?
如果不使用正则表达式,您可以 str.split
on '--'
并完成第一部分
>>> [i.split('--')[0].strip() for i in sample_text]
['199.72.81.55', 'unicomp6.unicomp.net', '199.120.110.21', 'burger.letters.com', '205.172.11.25']
类似的想法,但使用正则表达式
>>> import re
>>> [re.match(r'(.*) -- .*', i).group(1) for i in sample_text]
['199.72.81.55', 'unicomp6.unicomp.net', '199.120.110.21', 'burger.letters.com', '205.172.11.25']
在这两种情况下,您都可以使用列表理解来替换您的 for
循环
也许试试这样的事情:
sum(host, [])
你可以很容易地压平host
:
host = []
for i in range(0, len(sample_text)):
s=sample_text[i]
host += re.findall('[\d]*[.][\d]*[.][\d]*[.][\d]*|[a-z0-9]*[.][a-z]*[.][a-z]*', s)
print(host)
输出:
['199.72.81.55', 'unicomp6.unicomp.net', '199.120.110.21', 'burger.letters.com', '205.172.11.25']
re.findall()
returns 字符串列表。
文档:https://docs.python.org/3/library/re.html#re.findall
.append
会将列表作为单个项目添加到新列表中。
尝试:
host.extend(
我只是使用 .extend 而不是 append 解决了这个问题。
host.extend(re.findall('[\d]*[.][\d]*[.][\d]*[.][\d]*|[a-z0-9]*[.][a-z]*
[.][a-z]*', s))