建议Python正则表达式和选择列

301 浏览
0 Comments

建议Python正则表达式和选择列

这个问题已经有了答案

在Python中按白空格分割字符串[重复]

在一个由3、4或X个由空格分隔的列组成的文件中(不是常数空格,而是每行上的多个空格),我如何使用正则表达式选择每行的前两列?

我的文件包含:IP [空格] 子网掩码 [空格] 下一跳IP [新行]

所有行都使用该格式。我如何仅提取前两列?(IP和子网掩码)

这里是一个可以尝试你的正则表达式的示例:

10.97.96.0 10.97.97.128 47.73.1.0
47.73.4.128 47.73.7.6 47.73.8.0
47.73.15.0   47.73.40.0   47.73.41.0
85.205.9.164 85.205.14.44 172.17.103.0
172.17.103.8 172.17.103.48 172.17.103.56
172.17.103.96         172.17.103.100       172.17.103.136
172.17.103.140 172.17.104.44            172.17.105.28
172.17.105.32       172.17.105.220      172.17.105.224

不要关注特定的IP。我知道第二列不是有效的地址掩码。这只是一个例子。

我已经尝试过:

(?P\s*[1-9][0-9]{1,2}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})(?P\s*)(?P[1-9][0-9]{1,2}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}(\s+|\D*))

但它并不能完全工作...

admin 更改状态以发布 2023年5月25日
0
0 Comments

这是一个一行简述:

[s.split()[:2] for s in string.split('\n')]


示例

string = """10.97.96.0 10.97.97.128 47.73.1.0
47.73.4.128 47.73.7.6 47.73.8.0
47.73.15.0   47.73.40.0   47.73.41.0
85.205.9.164 85.205.14.44 172.17.103.0
172.17.103.8 172.17.103.48 172.17.103.56
172.17.103.96         172.17.103.100       172.17.103.136
172.17.103.140 172.17.104.44            172.17.105.28
172.17.105.32       172.17.105.220      172.17.105.224"""
print [s.split()[:2] for s in string.split('\n')]

输出

[['10.97.96.0', '10.97.97.128']
['47.73.4.128', '47.73.7.6']
['47.73.15.0', '47.73.40.0']
['85.205.9.164', '85.205.14.44']
['172.17.103.8', '172.17.103.48']
['172.17.103.96', '172.17.103.100']
['172.17.103.140', '172.17.104.44']
['172.17.105.32', '172.17.105.220']]

0
0 Comments

使用正则表达式:

如果您想获取前两列,不管它们包含什么,以及它们之间的任何数量的空格,可以使用 \S(匹配任何非空白字符)和 \s(仅匹配空白字符)来实现:

import re
lines = """
    47.73.4.128 47.73.7.6 47.73.8.0
    47.73.15.0   47.73.40.0   47.73.41.0
    85.205.9.164 85.205.14.44 172.17.103.0
    172.17.103.8 172.17.103.48 172.17.103.56
    172.17.103.96         172.17.103.100       172.17.103.136
    172.17.103.140 172.17.104.44            172.17.105.28
    172.17.105.32       172.17.105.220      172.17.105.224
"""
regex = re.compile(r'(\S+)\s+(\S+)')
regex.findall(lines)

结果:

[('10.97.96.0', '10.97.97.128'),
 ('47.73.1.0', '47.73.4.128'),
 ('47.73.7.6', '47.73.8.0'),
 ('47.73.15.0', '47.73.40.0'),
 ('47.73.41.0', '85.205.9.164'),
 ('85.205.14.44', '172.17.103.0'),
 ('172.17.103.8', '172.17.103.48'),
 ('172.17.103.56', '172.17.103.96'),
 ('172.17.103.100', '172.17.103.136'),
 ('172.17.103.140', '172.17.104.44'),
 ('172.17.105.28', '172.17.105.32'),
 ('172.17.105.220', '172.17.105.224')]

不使用正则表达式

如果您不想使用正则表达式,但仍然能处理多个空格,也可以做到:

while '  ' in lines:  # notice the two-spaces-string
    lines = lines.replace('  ', ' ')
columns = [line.split(' ')[:2] for line in lines.split('\n') if line]

优缺点:

使用正则表达式的优点是,如果分隔符包括制表符,它还会正确解析数据,而这在第二种解决方案中并非如此。
另一方面,正则表达式需要比简单字符串分割更多的计算量,这可能对非常大的数据集有所不同。

0