我试图计算一个看起来像这样的文件所包含的行数:
-StartACheck
---Lines--
-EndACheck
-StartBCheck
---Lines--
-EndBCheck
用这个:
count=0
z={}
for line in file:
s=re.search(r'\-+Start([A-Za-z0-9]+)Check',line)
if s:
e=s.group(1)
for line in file:
z.setdefault(e,[]).append(count)
q=re.search(r'\-+End',line)
if q:
count=0
break
for a,b in z.items():
print(a,len(b))
我想基本上将ACheck,BCheck等中存在的行数存储在字典中但是我一直得到错误的输出
像这样的东西
A,15
B,9
等
我发现尽管代码应该可行,但由于文件的打开方式,它并不存在。我无法改变它的打开方式,并且正在寻找一个只打开文件一次的实现,但是计算相同的内容并提供完全相同的输出,而不需要更新的python版本的所有附加功能。
答案 0 :(得分:0)
可以使用finite state machine解决此类问题。这是一个复杂的问题,需要比我在这里写的更多的解释。您应该仔细研究它以进一步了解您可以用它做什么。
但首先,我要做一些假设:
print()
,我猜你正在使用python 3.x 这是我的建议:
import re
input_filename = "/home/evens/Temporaire/StackOverflow/Input_file-39339007.txt"
matchers = {
'start_section' : re.compile(r'\-+Start([A-Za-z0-9]+)Check'),
'end_section' : re.compile(r'\-+End'),
}
inside_section = False # Am I inside a section ?
section_name = None # Which section am I in ?
tally = {} # Sums of each section
with open(input_filename) as file_read:
for line in file_read:
line_matches = {k: v.match(line) for (k, v) in matchers.items()}
if inside_section:
if line_matches['end_section']:
future_inside_section = False
else:
future_inside_section = True
if section_name in tally:
tally[section_name] += 1
else:
tally[section_name] = 1
else:
if line_matches['start_section']:
future_inside_section = True
section_name = line_matches['start_section'].group(1)
# Just before we go in the future
inside_section = future_inside_section
for (a,b) in tally.items():
print('Total of all "{}" sections: {}'.format(a, b))
此代码的作用是:
但即使这段代码也存在问题:
-StartACheck
可以-EndATotallyInvalidCheck
结束)您希望如何处理这些案件取决于您
这段代码可能会进一步简化,但我现在不想太复杂。
希望这会有所帮助。不要犹豫,询问您是否需要进一步解释。