gpt4 book ai didi

python - 如何从 python 中的一行捕获多个模式?

转载 作者:行者123 更新时间:2023-12-01 04:12:04 25 4
gpt4 key购买 nike

数据如下:

text textext text a 111.222.222.111(123) -> 22.222.111.111(7895)
txt txt txxt text b 22.111.22.222(8153) -> 153.33.233.111(195)
text text txt txt c 222.30.233.121 -> 44.233.111.111
txt text txt text d 22.111.22.222 -> 153.33.233.111

我想捕获 a、b 和 c 以及该线路上的两个 IP。我不想要附加到某些 IP 的括号中的数字。

我希望我的输出看起来像这样:

a 111.222.222.111 22.222.111.111
b 22.111.22.222 153.33.233.111
c 222.30.233.121 44.233.111.111

代码如下:

f=gzip.open(path+Fname,'rb')
for line in f:
IP_info=re.findall( r'(a|b|c)\s+([0-9]+(?:\.[0-9]+){3})+[ -> ]+([0-9]+(?:\.[0-9]+){3})', line )
print IP_info
f.flose

我的输出实际上是什么样的:

[('a', '111.222.222.111', '2.222.111.111')]
[('b', '22.111.22.222', '3.33.233.111')]

我遇到的两个最大的问题:

1) 输出中的第二个IP不完整。前两位数字已被截断。

2) 我没有捕获“c”的信息。

最佳答案

这是您可以使用的正则表达式:

\b([abcd])\s+([0-9]+(?:\.[0-9]+){3})(?:\(\d+\))? +-> +([0-9]+(?:\.[0-9]+){3})

参见regex demo

这里有几个有趣的点:

  • 我将您的 [ -> ]+ 替换为 +-> + 因为您的意思是匹配字符的序列,而不仅仅是单个字符不同顺序的字符。 请注意,字符类中的 -> 创建了一个范围,从空格到 >,其中包括特殊符号、标点符号和数字,也是。这就是为什么您的 IP 被部分“吃掉”。
  • 由于 IP 后面的括号内有可选数字,因此我在第一个 IP 后面添加了一个可选的非捕获组 (?:\(\d+\))?
  • 您在第一个捕获组中没有匹配 d(我将其转换为字符类,因为我只看到单个字母 - 如果这些是“占位符”,请恢复到具有替代项的组 - (a|b|c|d))。

参见Python demo :

import re
p = re.compile(r'\b([abcd])\s+([0-9]+(?:\.[0-9]+){3})(?:\(\d+\))? +-> +([0-9]+(?:\.[0-9]+){3})')
test_str = "text textext text a 111.222.222.111(123) -> 22.222.111.111(7895)\ntxt txt txxt text b 22.111.22.222(8153) -> 153.33.233.111(195)\ntext text txt txt c 222.30.233.121 -> 44.233.111.111\ntxt text txt text d 22.111.22.222 -> 153.33.233.111"
for x in test_str.split("\n"):
print(re.findall(p, x))

输出:

[('a', '111.222.222.111', '22.222.111.111')]
[('b', '22.111.22.222', '153.33.233.111')]
[('c', '222.30.233.121', '44.233.111.111')]
[('d', '22.111.22.222', '153.33.233.111')]

关于python - 如何从 python 中的一行捕获多个模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34794032/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com