如何找到一个没有字母s的7个字母的单词,并且只包含一个单词文件中的一个元音?

时间:2017-02-06 15:11:26

标签: python file-search

我被要求编写一个代码,用于打印“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())

6 个答案:

答案 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://pymotw.com/2/re/

他们需要稍微习惯,但他们对于筛选字符串非常宝贵。

如果你对他们完全陌生,那么有很多像这样的互动教程(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