我有一个data.txt和一个count.py。
我在data.txt中的数据看起来像这样:
hermione [
{
keyword.adsf
keyword.bsdf
},
{
keyword.1sdf
keyword.bsd
keyword.bsd
}
]
ron [
{
keyword.adsf
keyword.bsdf
},
{
keyword.1sdf
keyword.bsd
keyword.bsd
}
]
我想要做的是使用python计算每个{}内keyword.xxx
个出现次数。换句话说,我希望我的输出是这样的:
hermione [
{
2
},
{
3
}
]
ron [
{
2
},
{
3
}
]
我想在count.py中,我会写脚本来计算,并将data.txt视为一个大字符串。
到目前为止,这是我编写的代码:
from sys import argv
script, filename = argv
txt = open(filename).read()
def count_in_bracket():
print txt
print count_in_bracket()
(我在终端中运行python custom_fields_nocount.py custom_fields_nocount.txt
。)
...这并不多,因为它不会遍历每个{}括号。
这是我无法搞清楚的部分。我怎么写像
这样的东西list = ['ron', 'hermione']
for {} in list:
print len(CONTENTS_OF_EACH_{}.split("keyword"))-1
答案 0 :(得分:1)
使用正则表达式,您可以:
import re
contents_of_each = re.findall('{([^}]+?)}', txt, re.DOTALL)
这将为您提供一个列表,其中包含{}
它是如何工作的:它搜索一个开放的卷曲,然后是一个或多个不是接近卷曲的字符的序列,然后是一个接近卷曲的字符,但只返回括号内的字符。
re.DOTALL
将换行视为常规字符,匹配跨越多行的卷对。
答案 1 :(得分:1)
这是使用纯Python做到这一点的一种方法。如果您需要更复杂的处理而不仅仅是计算事物,这可能会很方便。
import sys
def prn(s):
sys.stdout.write(str(s))
def _parse_list(f, line):
if line.strip() != '{':
raise ValueError("list part must start with '{'")
prn(line)
count = 0
found_list_end = False
for line in f:
if line.strip().startswith('}'):
found_list_end = True
break
count += 1
if not found_list_end:
raise ValueError("list part must end with '}'")
prn(" {}\n".format(count))
prn(line)
def parse_section(f):
found_section_start = False
for line in f:
prn(line)
words = line.split()
if len(words) == 2 and words[1] == '[':
found_section_start = True
break
if not found_section_start:
return False
for line in f:
if line.strip() == ']':
prn(line)
return True
_parse_list(f, line)
return True
with open("data.txt", "rt") as f:
while parse_section(f):
pass