Python正则表达式匹配多次,分别存储结果

时间:2017-11-21 19:45:36

标签: python regex

我是一名网络工程师,试图将我的脚趾插入编程。我被推荐尝试使用Python。

我要做的是保存一些特定的数据,使用regexp匹配多行的字符串。我们将数据存储在SourceData

SourceData = '
ip route 22.22.22.22 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1
ip route 33.33.33.33 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1
ip route 11.22.33.44 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1
ip route 11.11.12.11 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1
ip route 11.11.13.11 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1
ip route 11.11.14.0 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1
ip route 44.44.44.0 255.255.255.0 TenGigabitEthernet0/1/0 1.1.1.1'

SourceData中存储的行数始终未知。可以是0行(空)到无限行。

我希望匹配包含以11开头的ipv4-addresses的所有行。

这是我作为一个开始提出的:

ip1 = re.search('11\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}', SourceData)
        if ip1:
            ip1 = ip1.group()

验证

>>> print ip1
11.22.33.44
好的,似乎有效。我们的想法是,当整个SourceData匹配时,提供示例,此案例的最终结果将是4个匹配:

ip1 = 11.22.33.44
ip2 = 11.11.12.11
ip3 = 11.11.13.11
ip4 = 11.11.14.0

接下来要了解,如何继续检查SourceData以获得更多匹配,如上所述,以及如何存储多个匹配项以便稍后在代码中使用?例如,稍后在代码中我想使用特定匹配的值,让我们说匹配号4(11.11.14.0)。

我已经阅读了Python和Regex的一些指南,但似乎我完全不理解它:)

3 个答案:

答案 0 :(得分:3)

您可以使用re.findall返回所有匹配

>>> re.findall(r'11\.\d{1,3}\.\d{1,3}\.\d{1,3}', SourceData)
['11.22.33.44', '11.11.12.11', '11.11.13.11', '11.11.14.0']

答案 1 :(得分:2)

有几种方法,其中之一是:

import re

string = """
ip route 22.22.22.22 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1
ip route 33.33.33.33 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1
ip route 11.22.33.44 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1
ip route 11.11.12.11 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1
ip route 11.11.13.11 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1
ip route 11.11.14.0 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1
ip route 44.44.44.0 255.255.255.0 TenGigabitEthernet0/1/0 1.1.1.1'
"""

rx = re.compile(r'^[^\d\n]*(11(?:\.\d+){3})', re.M)

lines = [match.group(1) for match in rx.finditer(string)]
print(lines)    

这会产生:

['11.22.33.44', '11.11.12.11', '11.11.13.11', '11.11.14.0']

<小时/> 这里的核心是

^            # match start of the line
[^\d\n]*     # NOT a digit or a newline, 0+ times
11           # 11
(?:\.\d+){3} # .0-9 three times
.+           # rest of the line

其余的是通过re.finditer()和列表理解来完成的 请参阅a demo on regex101.com

答案 2 :(得分:1)

您可以使用with open("statecity.csv") as csvfile: csvreader = csv.reader(csvfile, delimiter=",") for line in csvreader: State_Name = line[0] City_Name = line[1] cityid = Select(driver.find_element_by_id('Location_CityId')) try: cityid.select_by_visible_text(City_Name) print City_Name +" " + "FOUND" except: print City_Name +" " + "NOT FOUND" 带有正面的后顾之处,以确保匹配re.findall之后的正确地址:

"ip route"

输出:

import re
s = """
  ip route 22.22.22.22 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1
  ip route 33.33.33.33 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1
  ip route 11.22.33.44 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1
  ip route 11.11.12.11 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1
  ip route 11.11.13.11 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1
  ip route 11.11.14.0 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1
  ip route 44.44.44.0 255.255.255.0 TenGigabitEthernet0/1/0 1.1.1.1' 
 """
final_ips = re.findall('(?<=ip route\s)11[\d\.]+', data)