import re
f = open('/Users/Half_Pint_Boy/Desktop/sentenses.txt', 'r')
a=0
c=0
e=[]
for line in f:
b=re.split('[^a-z]', line.lower())
a+=len(list(filter(None, b)))
c = c + 1
e = e + b
d = dict(zip(e, range(len(e))))
但最后我收到一个带有空格的字典:
{'': 633,
'a': 617,
'according': 385,
'adjacent': 237,
'allow': 429,
'allows': 459}
如何删除""从dict的最终结果?另外如何在此之后更改索引以不使用""在索引计数? (使用""索引计数为633,没有-248) 非常感谢!
答案 0 :(得分:2)
这个怎么样?
b = list(filter(None, re.split('[^a-z]', line.lower())))
作为替代方案:
b = re.findall('[a-z]+', line.lower())
无论哪种方式,您都可以从下一行中删除filter
:
a += len(b)
修改强>
顺便说一句,我认为你最终得到的是一个字典,将单词映射到最后一个位置,在这些位置出现在文本中。我不确定这是不是你打算做什么。 E.g。
>>> dict(zip(['hello', 'world', 'hello', 'again'], range(4)))
{'world': 1, 'hello': 2, 'again': 3}
如果您想要跟踪所有单词出现的位置,请尝试使用此代码:
from collections import defaultdict
import re
indexes = defaultdict(list)
with open('test.txt', 'r') as f:
for index, word in enumerate(re.findall(r'[a-z]+', f.read().lower())):
indexes[word].append(index)
indexes
然后将每个单词映射到单词出现的索引列表。
编辑2
根据下面的评论讨论,我想你想要更像这样的东西:
from collections import defaultdict
import re
word_positions = {}
with open('test.txt', 'r') as f:
index = 0
for word in re.findall(r'[a-z]+', f.read().lower()):
if word not in word_positions:
word_positions[word] = index
index += 1
print(word_positions)
# Output:
# {'hello': 0, 'goodbye': 2, 'world': 1}
答案 1 :(得分:1)
替换:
d = dict(zip(e, range(len(e))))
使用:
d = {word:n for n, word in enumerate(e) if word}
或者,要首先避免空条目,请替换:
b=re.split('[^a-z]', line.lower())
使用:
b=re.split('[^a-z]+', re.sub('(^[^a-z]+|[^a-z]+$)', '', line.lower()))
答案 2 :(得分:1)
你的正则表达式看起来不是很好。考虑使用:
line = re.sub('[^a-z]*$', '', line.strip())
b = re.split('[^a-z]+', line.lower())