当某些列为空时如何匹配多列数据?

时间:2017-07-11 16:01:01

标签: python regex

我要匹配以下模式。

98.40.1.0/12     104.12.1.222                           0 37430 9123 817 i

                 44.156.112.10            0              0 2224 6336 711 i

                 51.134.121.9                           0 7456 8936 1222 900 i

我写了如下表达式:

\s+(\S+)\s+(\S+)(?:\d+\s+|\s+)(?:\d+\s+|\s+)(.*)

,但它并不适用于所有三行,因为第二行和第三行在第一列中没有数据。

有人可以为我建议一个解决方案吗?

2 个答案:

答案 0 :(得分:0)

以下正则表达式工作(在python中测试):

((\d*\.\d*\.\d*\.\d*)([\/]\d*)?)(\s*\d*\.\d*\.\d*\.\d*)*((\s*\d*)*)

此解决方案仅适用于假设:模式“98.40.1.0/12”仅在开始时,其他的其他模式将为“104.12.1.222”

输出 - 应仅在位置1,4和5处使用匹配:

Match 1
1.  98.40.1.0/12
2.  98.40.1.0
3.  /12
4.  104.12.1.222
5.  0 37430 9123 817
6.  Empty

Match 2
1.  44.156.112.10
2.  44.156.112.10
3.  None
4.  None
5.  0 0 2224 6336 711
6.  Empty

Match 3
1.  51.134.121.9
2.  51.134.121.9
3.  None
4.  None
5.  0 7456 8936 1222 900
6.  Empty

答案 1 :(得分:0)

这是一个很好的方法:

  • 使用捕获组和部件捕获您想要的内容 到"省略"应该介于这些群体之间。
  • 如果多次出现相同的模式,则:
    • 定义命名模式一次
    • 多次调用。

尝试符合上述规则的解决方案(为了便于阅读,我将其拆分 分为2行):

(?(DEFINE)(?<IP>\d+\.\d+\.\d+\.\d+))
^((?&IP)\/\d+)?\s+((?&IP))(?:\s+0)+ ((?:\d+ )+\d+)

包含选项g全球)和m多行)。

各个部分的描述:

  • (?(DEFINE)(?<IP>\d+\.\d+\.\d+\.\d+)) - 定义命名捕获 组(组#1,名称IP)。这只是一个定义,这个 小组(到目前为止)没有捕获任何东西。
  • ^ - 由于m选项而导致的一行(不是整个字符串)。
  • ((?&IP)\/\d+)? - 捕获第2组,包括:
    • a&#34; call&#34; IP组的成员,
    • 斜线和数字序列,
    • 所有这些可选项(最后都为?)。
  • \s+ - 一系列空格。
  • ((?&IP)) - 捕获第3组 - 另一个&#34;电话&#34; IP群组。
  • (?:\s+0)+ - 非捕获组 - 空格和0,重复 好几次。
  • - 上一个0之后的空格。
  • ((?:\d+ )+\d+) - 捕获第4组,包括:
    • 一系列数字和一个空格,重复几次,
    • 最后一位数字。

此正则表达式捕获:

  • 从第1行开始:
    • 98.40.1.0/12 - 第2组,
    • 104.12.1.222 - 第3组,
    • 37430 9123 817 - 第4组。
  • 从第2行开始:
    • 第2组一无所获,
    • 44.156.112.10 - 第3组,
    • 2224 6336 711 - 第4组。
  • 从第3行开始:
    • 第2组一无所获,
    • 51.134.121.9 - 第3组,
    • 7456 8936 1222 900 - 第4组。