我确定如果存在解决方案,那么它会在某处,但我无法找到它。我已经跟随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
...
抱歉可怕的格式化 - 从我正在处理的内容中复制和粘贴!
答案 0 :(得分:1)
问题是INS
模式在INS
或INS 1
等INS 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