正则表达式匹配字符串中的特定单词但排除索引版本

时间:2017-11-30 09:10:11

标签: python regex

我确定如果存在解决方案,那么它会在某处,但我无法找到它。我已经跟随Python regex to match a specific word并在第一个方面取得了成功,但现在我正在努力解决第二个问题。

我继承了一种可怕的文件格式,每个测试结果都在自己的行上。它们被限制为每个记录12个字符,因此一些结果被分成若干行,例如SITE,SITE1和SITE2。我试图将文件解析为字典,以便我可以用它做更多的分析,最终生成一个格式化的报告。

上面的代码/下面的代码允许我匹配每个SITE并将它们连接在一起,但它给我带来了正确匹配INS,INS 1和INS 2的问题。是的,空间是故意的 - 这是我必须处理的。 INS是测试结果,INS 1是通过测试的限制。

是否有与

匹配的正则表达式

网站> SITE True但SITE> SITE1错误

INS> INS是真但INS到INS 1假吗?

这是python代码。

import re    
lines = ['SITE start', 'SITE1 more', 'SITE2 end','INS value1', 'INS 1 value2']
headings = ['SITE','SITE1',"SITE2", "INS", "INS 1"]
for line in lines:
    for heading in headings:
        headregex = r"\b" + heading + r"\b"
        match = re.search(headregex,heading)
        if match:
            print "Found " + heading + " " + line
        else:
            print "Not Found " + heading + " " + line

这是一些虚拟数据:

TEST MODE 131 AUTO SITE startaddy SITE1 middle addy SITE2 end addy
USER DB VISUAL CHECK P BOND RANGE 25A EARTH 0.09 OHM P LIMIT 0.10 OHM INS 500 V INS 1 >299 MEG P ... TEST MODE 231 AUTO SITE startaddy SITE1 middle addy SITE2 end addy USER DB VISUAL CHECK P INS 500 V INS 2 >299 MEG P ...

抱歉可怕的格式化 - 从我正在处理的内容中复制和粘贴!

2 个答案:

答案 0 :(得分:1)

问题是INS模式在INSINS 1INS 2中找到了部分匹配。

在提取替代方案的情况下,习惯上使用从最长值开始的替换(例如INS \d+|INS),但在这种情况下,您希望获得所有正则表达式匹配的列表,仅排除某些重叠标题匹配。

要实现这一点,可以通过将所有标题项视为正则表达式来排除该匹配,并将INS模式定义为INS(?! \d)以确保INS不匹配如果跟着一个空格和一个数字。

请参阅Python demo

import re    
lines = ['SITE start', 'SITE1 more', 'SITE2 end','INS value1', 'INS 1 value2']
headings = ['SITE','SITE1',"SITE2", r"INS(?! \d)", "INS 1"]
headings=sorted(headings, key=lambda x: len(x), reverse=True)
for line in lines:
    print("----")
    for heading in headings:
        headregex = r"\b{}\b".format(heading)
        match = re.search(headregex,heading)
        if match:
            print "Found " + heading + " " + line
        else:
            print "Not Found " + heading + " " + line

答案 1 :(得分:0)

只是给出一个可以解决问题的答案,同时避免一些单调乏味,这是你想要实现的目标吗?

import re

lines = ['SITE start', 'SITE1 more', 'SITE2 end','INS value1', 'INS 1 value2']
headings = ['SITE','SITE1',"SITE2", "INS", "INS 1"]

headings_re = re.compile(r"(SITE\d? )?(INS( \d)?)? (.*)") 
# build by hand, only works if SITE and INS are the literal identifiers 

site = []
ins = []

for line in lines:
  match = headings_re.match(line)
  if match:
    if match.group(1):
      site.append(match.group(4))
    elif match.group(2):
      ins.append(match.group(4))
    else:
      print("something weird happened")
      print(match.group(0))
  else:
    print("something weird happened")
    print(line)

print("SITE: {}".format(" ".join(site)))
>> SITE: start more end
print("INS: {}".format(" ".join(ins)))
>> INS:  value1  value2