我被要求编写一个代码,用于打印“dictionary.txt”(一个250,000字的文件)中的单词,这些单词只包含一个元音,没有字母“s”,长度为7个字母。我知道我必须定义一个打开文件的函数,并搜索它以满足这些要求。
我不允许使用正则表达式,文件每行一个字。
这是我当前的python脚本:
a="a"
e="e"
i="i"
o="o"
u="u"
y="y"
def search():
Input=open("dictionary.txt","r")
for word in Input:
word=Input.lower()
vowel=len(word-a)==6 or len(word-e)==6 or len(word-i)==6 or len(word-o)==6 or len(word-u)==6 or len(word-y)==6
if len(word)==7 and "s" not in word and vowel==True:
return word
print(search())
答案 0 :(得分:2)
这可能是使用正则表达式实现任务的最简单最简单的方法。
select (select Meter from tbl where Date = '2014-12-01') -
(select Meter from tbl where Date = '2014-11-01');
修改强> 因为你已经编辑过说你不能使用正则表达式,所以你可以这样做。
with open("dictionary.txt","r") as file: #use r to open in read only mode to not mess with file
words=[]
for line in file: #loop through every line to get all words
words.append(line)
import re
for word in words:
if len(re.findall('[aeiou]', word)) == 1 and len(word)==7 and "s" not in word: #checks if there is only one vowel and length is 7
print(word)
答案 1 :(得分:2)
不需要正则表达式。套装非常快。
text = open('dictionary.txt').read()
vowels = 'aeiou'
vowelsSet = set(vowels)
for word in text.split():
word = word.lower()
if len(word)==7 and not 's' in word and len(set(word)-vowelsSet)==6:
print (word)
第一行中的开放式读取组合会使单词集合徘徊 - 假设除了单词中的撇号之外它不包含标点符号,并且不超过一行。
通过将任意给定单词中设置字符的大小与元音的 set 的大小进行比较,可以确定元音是否已被重复。原则是,例如, moan 中字符集的大小为4, moon 中字符集的大小为3。
答案 2 :(得分:2)
一个班轮正则表达式,迎接挑战:
^(?:[b-df-hj-np-rtv-z])*[aeiou](?:[b-df-hj-np-rtv-z])*(?<=\w{7})$
(?:[b-df-hj-np-rtv-z])*
非捕获0到许多组成者,除了s [aeiou]
只有一个元音(?:[b-df-hj-np-rtv-z])*
非捕获0到许多组成者,除了s 您现在拥有规则&#34;正好一个元音&#34;
(?<=\w{7})
从这一点开始回到起点,看看是否匹配:正好是7个字母当然,我同意可以进行三项简单的测试,以便更好地进行维护。
答案 3 :(得分:1)
假设你的dictionary.txt只包含空格分隔的单词和换行符,可以这样做:
# Open the file and construct a list of single words
with open("dictionary.txt", "r") as infile:
x = [i.strip() for i in infile.read().split(" ")]
# Function for finding number of vowels in a word
def vowels(word):
count = 0
for i in word:
if i in 'aeoui':
count += 1
return count
# Check the length of each word, if it contains s and if the number of vowels is one at most
for i in x:
if len(i) == 7 and "s" not in i and vowels(i) <= 1:
print(i)
答案 4 :(得分:0)
我不在办公桌旁,所以我无法给你一个编纂的答案,但我的第一直觉是使用正则表达式来选择你之后的单词。 &#34;&#34;图书馆是你想要开始的地方。
他们需要稍微习惯,但他们对于筛选字符串非常宝贵。
如果你对他们完全陌生,那么有很多像这样的互动教程(https://regexone.com/)可以帮助你入门。
答案 5 :(得分:0)
假设您将整个字典文件读入一个数组然后循环遍历此数组(使用&#39; word&#39;作为循环变量),请将其放在循环之前:
import re
# this to make sure there is no 's' in word and its length is exactly 7 characters
no_s_re = re.compile(r'^[a-rt-z]{7}$', re.IGNORECASE)
# this to count vowels (later)
vowels_re = re.compile(r'[aioue]', re.IGNORECASE)
这是循环体:
if no_s_re.match(word) and len(vowels_re.findall(word)) == 1:
print word