我是一名网络工程师,试图将我的脚趾插入编程。我被推荐尝试使用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的一些指南,但似乎我完全不理解它:)
答案 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)