我的目标是在文本中找到IP地址。
使用grep,我可以使用正则表达式"use strict";
$(document).ready(function () {
$('.export-table').DataTable({
fixedHeader: {
header: true
},
dom: 'Bflit',
lengthMenu: [
[100, -1],
['100 rows', 'Show All']
],
buttons: [
{
extend: 'excel',
exportOptions: {
columns: [1, 2, 3, 4],
exportOptions: {
format: {
body: function (data, row, column, node) {
return data.replace(/\./g, ' ');
}
}
}
}
}
]
});
$('.data-table').DataTable({
"lengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]]
});
$('#datable_2').DataTable({ "lengthChange": false });
});
来做到这一点。
使用Python中的([0-9]+\.){3}[0-9]+
,除非我在括号内的表达式前面加上re
我知道使用?:
会阻止创建组,但是删除此前缀后我无法解释结果。
?:
答案 0 :(得分:2)
查看re.findall的文档:
以字符串列表形式返回字符串中所有不重复的模式匹配项。从左到右扫描该字符串,并以找到的顺序返回匹配项。 如果该模式中存在一个或多个组,则返回一个组列表; 如果该模式具有多个组,则这将是一个元组列表。空匹配项包含在结果中。
强调我的。您的第一个模式中没有捕获组,因此它在提供的输入中以字符串形式返回一个完全匹配项:
['10.11.1。']
但是使用([0-9]+\.){3}
,您确实有一个捕获组,因此它不是返回完整的匹配项作为字符串,而是返回一个组列表。请记住
重复捕获组将仅捕获最后一次迭代。在重复的组周围放置一个捕获组以捕获所有迭代,或者如果您对数据不感兴趣,则使用非捕获组
这就是为什么在结果中只能看到该组的 last 重命名为['1.']
的原因。 (不包括完整匹配,只有被捕获的组)
答案 1 :(得分:1)
根据the documentation(重点是我):
re.findall(pattern, string, flags=0)
将
pattern
中string
的所有非重叠匹配项作为字符串列表返回。string
从左到右扫描,并以找到的顺序返回匹配项。 如果该模式中存在一个或多个组,则返回一个组列表; 如果该模式具有多个组,则这将是一个元组列表。空匹配项包含在结果中。
您的第一个示例使用了一个非捕获组,因此,模式findall
中没有“ no group”可返回。因此,它将返回完整模式匹配的所有结果的列表。在您的情况下,这意味着完整的IP。
在第二个示例中,有一个捕获组,因此说明的突出显示部分适用:而不是返回所有完全匹配的列表,您只会得到一个组列表。
但是您的模式中只有一个组。该组被捕获多次 ,但是每个组只能捕获一个值。这是正则表达式的限制。因此,对于您的示例,findall
结果中只有最后捕获的值可用。
如果您想捕获重复的组,则必须主动捕获那些位于单独组中的组,例如使用((\d+\.){3})
。这将给您两个小组。第一个捕获10.1.1.
,第二个捕获1.
。
答案 2 :(得分:0)
您可以使用以下link to repl:
import re
s = '64 bytes from 10.11.1.5: icmp_seq=2 ttl=128 time=215 ms'
r = re.compile(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")
ip = r.findall(s)
print(ip)