在Python中查找给定长度的所有单词

时间:2018-07-19 10:49:21

标签: python string

我想创建一个函数来查找给定长度的所有单词,但是我不能使用re.findall来实现它,因为它仅适用于整数。

这似乎不起作用:

f = open("wordlist.txt", "r")
line = f.readlines()
a = 14
k = re.findall(r'\b[a-zA-Z]{a}\b', ' '.join(line))
r = random.choice(k)

都不是:

d = input()
k = re.findall(r'\b[a-zA-Z]{d}\b', ' '.join(line))
r = random.choice(k)

两者都给: IndexError:无法从空序列中选择

我该怎么办?

8 个答案:

答案 0 :(得分:3)

您不需要正则表达式:

sentence = "You don't need a regex to get words of length n"
length = 4
print([word for word in sentence.split() if len(word) == length])
# ['need']

答案 1 :(得分:1)

您可以执行类似此列表理解的操作

words = ['apple', 'cat', 'dog', 'banana','ape']
filtered_words = [word for word in words if len(word) == 3]

这只会在filtered_words列表中添加3个字符的单词。

答案 2 :(得分:0)

请参阅post。似乎是重复的问题。发表任何重复的问题之前,请务必先搜索。这篇文章清楚地说明了find函数的实现。

还添加了答案的重要部分。

pod 'Firebase/xxx'

答案 3 :(得分:0)

如果您要使用正则表达式执行输入指定的长度:

import re

search_length = input()

# it's 3 brace pairs as two are needed to escape a literal brace in the resulting     
# string and the inner braces for formating with your search_length

pattern = r'\b\w{{{}}}\b'.format(search_length)  
k = re.findall(pattern, ' '.join(line))

但是,正如其他答案所述,除了正则表达式外,还有其他几种方法可能是一种更优雅的解决方案。

答案 4 :(得分:0)

使用collections.defaultdict作为将单词长度映射到单词的字典。下面的解决方案具有O(n)复杂度。

对于多个计数,这将比每次为每个计数解析一个句子更有效,从而产生O(m * n)复杂性。

from collections import defaultdict

d = defaultdict(set)

sentence = "You don't need a regex to get words of length n"

for word in sentence.split():
    d[len(word)].add(word)

结果:

print(d)

defaultdict(set,
            {1: {'a', 'n'},
             2: {'of', 'to'},
             3: {'You', 'get'},
             4: {'need'},
             5: {"don't", 'regex', 'words'},
             6: {'length'}})

然后,使用d[3]来访问所有长度为3的单词。

答案 5 :(得分:0)

尝试一下:

l = 14
k = re.findall(r'\b[a-zA-Z]{{{}}}\b'.format(l), line)

答案 6 :(得分:0)

您的正则表达式未使用a的值。 这样可以解决问题:

words = ['foo', 'bar', 'foobar']
a = 3
k = re.findall(r'\b[a-zA-Z]{%s}\b' % a, ' '.join(words))
print k

返回:

['foo', 'bar']

答案 7 :(得分:0)

如果输入文件中包含,.等符号,则可以先过滤文件并删除它们,然后执行过滤:

text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
symbols = [',', '.', '!', '?']
length = 4

words = "".join([i for i in text if not i in symbols])
words = list(filter(lambda i: len(i)==length,words.split()))
print(words)

输出:

['amet', 'elit']