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