我一直在Python中使用regex表达式,以便在单词出现一次之后对某个序列进行匹配。我遇到了两个问题: 1)我试图搜索的文本在我想要用作触发词的单词和我想要匹配的单词之间有不同数量的字符;2)文本是多行的。
在下面的示例文本中,我希望匹配“滞后-10:10”和“滞后-10:20”,但不匹配“滞后-10:30”:
vprn 5001 name "5001" customer 1 create
interface "to-VPLS-6663000" create
sap lag-10:10 create
interface "to-VPLS-3000500" create
sap lag-10:20 create
vpls 3410001 name "XYZBDVLAN1" customer 1 create
sap lag-10:30 create我正在寻找的结果是“滞后-10:10”,“滞后-10:20”。我也不能仅仅在这些术语上进行匹配,因为任何数字都被期望在“滞后-”之后,而且我只想捕捉这个组,如果它是在“接口”一词之后(在上面的例子中,不是在单词"vpls“之后,就像在滞后性-10:30)。
使用我正在使用的网络设备,“接口”和“延迟”之间的文本可能会有所不同。我最初想出的方法是只匹配序列lag-10:[^ ]*一次,并且只在“接口”一词出现之后匹配。问题是..。我不知道该怎么做。我尝试过的每一件事都捕获了太多或不够的文本,并且由于“延迟”与“界面”不同的事实而变得复杂。
任何帮助都将不胜感激,因为我在Regex是非常新的!
发布于 2022-02-04 01:47:40
下面是在多行模式下使用re.findall的一种方法:
inp = """ vprn 5001 name "5001" customer 1 create
interface "to-VPLS-6663000" create
sap lag-10:10 create
interface "to-VPLS-3000500" create
sap lag-10:20 create
vpls 3410001 name "XYZBDVLAN1" customer 1 create
sap lag-10:30 create"""
matches = re.findall(r'^\s+\binterface.*?\n\s+sap (lag-\d{1,2}:\d{2})', inp, flags=re.M)
print(matches) # ['lag-10:10', 'lag-10:20']上面使用的regex模式匹配以interface作为第一个单词的一行,后面是一个包含sap-和一个小时:分钟时间戳的行。
发布于 2022-02-04 02:04:25
这里有几种不同的解决方案,只要这些值总是按照您指定的那样工作:
import re
text = """ vprn 5001 name "5001" customer 1 create
interface "to-VPLS-6663000" create
sap lag-10:10 create
interface "to-VPLS-3000500" create
sap lag-10:20 create
vpls 3410001 name "XYZBDVLAN1" customer 1 create
sap lag-10:30 create"""
pattern = r'lag-\d{2}:[1-2]0'
result = re.findall(pattern,text,re.MULTILINE)
print(result)
pattern = r'lag-\d{2}:[1-2]\d{1}'
result = re.findall(pattern,text,re.MULTILINE)
print(result)https://stackoverflow.com/questions/70980538
复制相似问题