Python 正则表达式匹配字符串中的特定单词,但不包括索引版本

Python 正则表达式匹配字符串中的特定单词,但不包括索引版本,python,regex,Python,Regex,我敢肯定,如果有一个解决方案,那么它就在某个地方,但我找不到它。我在第一个方面也取得了成功,但现在我正在第二个方面努力 我继承了一种可怕的文件格式,其中每个测试结果都在自己的行上。每个记录限制为12个字符,因此一些结果被分成几行,例如SITE、SITE1和SITE2。我正试图将文件解析到字典中,以便对其进行更多分析,最终生成格式化的报告 上面的链接/下面的代码允许我匹配每个站点并将它们连接在一起,但它给我带来了正确匹配INS、INS1和INS2的问题。是的,空间是有意的——这是我必须处理的。IN

我敢肯定,如果有一个解决方案,那么它就在某个地方,但我找不到它。我在第一个方面也取得了成功,但现在我正在第二个方面努力

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

上面的链接/下面的代码允许我匹配每个站点并将它们连接在一起,但它给我带来了正确匹配INS、INS1和INS2的问题。是的,空间是有意的——这是我必须处理的。INS是测试结果,INS 1是通过测试的极限

有匹配的正则表达式吗

站点>站点为True,但站点>站点1为false

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
下面是一些虚拟数据:

测试模式131自动
站点开始
地点1中亚迪
站点2结束地址
用户数据库 目视检查P 键范围25A 接地0.09欧姆P 极限0.10欧姆 INS 500 V INS 1>299兆欧/加仑 ... 测试模式231自动 站点开始 地点1中亚迪 站点2结束地址 用户数据库 目视检查P INS 500 V INS2>299兆欧/加仑 ...


抱歉的可怕的格式-它的复制和粘贴从我正在处理的

仅仅给出一个可能解决问题的答案,同时避免一些繁琐的工作,这就是你想要达到的目标吗

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

问题是
INS
模式在
INS 1
INS 2
等中的
INS
中找到部分匹配

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

为了实现这一点,可以通过将所有标题项视为正则表达式来排除匹配,并将
INS
模式定义为
INS(?!\d)
,以确保
INS
后面有空格和数字时不匹配

见:


为什么要同时使用
re.escape
\b
s?
标题可以包含哪些内容?他们能以非单词字符开始/结束吗?例如:escape和\b-缺乏经验!从我得到的24条左右的样本记录来看,它们看起来都是以字母开头,没有空格等,但后面会出现很多其他空格。你能给出一个实际的例子吗?从您给出的描述来看,我不确定到底需要满足哪些条件。Arne,如果您可以运行代码,那么站点应该与站点匹配,而不是站点1或站点2。Ins应与Ins匹配,但不与Ins 1匹配。您只能通过在
Ins
后添加
(?!1\b)
前瞻来排除该匹配,请参阅。您似乎想检查是否所有标题都匹配,而不仅仅是第一个找到的标题,这使它变得相当困难。不。这帮不了我-对不起。我将编辑原始问题以显示一些虚拟数据。
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