建议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日
这是一个一行简述:
[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']]
使用正则表达式:
如果您想获取前两列,不管它们包含什么,以及它们之间的任何数量的空格,可以使用 \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]
优缺点:
使用正则表达式的优点是,如果分隔符包括制表符,它还会正确解析数据,而这在第二种解决方案中并非如此。
另一方面,正则表达式需要比简单字符串分割更多的计算量,这可能对非常大的数据集有所不同。