我想创建一个函数来查找给定长度的所有单词,但是我不能使用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:无法从空序列中选择
我该怎么办?
答案 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)
答案 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']