非捕获版本的常规括号Python

时间:2018-07-30 21:44:49

标签: python regex

我的目标是在文本中找到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

,否则我不明白为什么它不起作用

我知道使用?:会阻止创建组,但是删除此前缀后我无法解释结果。

?:

3 个答案:

答案 0 :(得分:2)

查看re.findall的文档:

  

以字符串列表形式返回字符串中所有不重复的模式匹配项。从左到右扫描该字符串,并以找到的顺序返回匹配项。 如果该模式中存在一个或多个组,则返回一个组列表; 如果该模式具有多个组,则这将是一个元组列表。空匹配项包含在结果中。

强调我的。您的第一个模式中没有捕获组,因此它在提供的输入中以字符串形式返回一个完全匹配项:

  

['10.11.1。']

但是使用([0-9]+\.){3},您确实有一个捕获组,因此它不是返回完整的匹配项作为字符串,而是返回一个组列表。请记住

  

重复捕获组将仅捕获最后一次迭代。在重复的组周围放置一个捕获组以捕获所有迭代,或者如果您对数据不感兴趣,则使用非捕获组

这就是为什么在结果中只能看到该组的 last 重命名为['1.']的原因。 (不包括完整匹配,只有被捕获的组

答案 1 :(得分:1)

根据the documentation(重点是我):

  

re.findall(pattern, string, flags=0)

     

patternstring的所有非重叠匹配项作为字符串列表返回。 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)