我已经盯着这个问题几个小时了,我不知道使用什么正则表达式格式来解决这个问题。
问题:
给定以下输入字符串,找到所有可能的 5 个字符或更长的输出单词。
- qwertyuytresdftyuioknn
- gijakjthoijerjidsdfnokg
您的程序应该找到可以从提供的字符串派生的所有可能的单词(5 个以上字符)。 使用http://norvig.com/ngrams/enable1.txt作为您的搜索词典。 输出单词的顺序并不重要。
- 女王问题
- gaeing garring 聚集 门 geeing gieing 去 刺伤
关于输入字符串的假设:
- QWERTY 键盘
- 仅小写 a-z,无空格或标点符号
- 输入字符串的第一个和最后一个字符将始终匹配 所需输出单词的第一个和最后一个字符。
- 不要假设用户在字母之间采用最有效的路径
- 输出单词的每个字母都会出现在输入字符串中
尝试的解决方案:
首先,我从该网页下载了单词并将它们存储在我的计算机中的文件中(“words.txt”):
import requests
res = requests.get('http://norvig.com/ngrams/enable1.txt')
res.raise_for_status()
fp = open('words.txt', 'wb')
for chunk in res.iter_content(100000):
fp.write(chunk)
fp.close()
然后我尝试使用正则表达式匹配我需要的单词。问题是我不知道如何格式化我的 re.compile()
来实现此目的。
import re
input = 'qwertyuytresdftyuioknn' #example
fp= open('words.txt')
string = fp.read()
regex = re.compile(input[0]+'\w{3,}'+input[-1]) #wrong need help here
regex.findall(string)
很明显,这是错误的,因为我需要从左到右匹配输入字符串中的字母,而不是我错误地与 \w{3 匹配的任何字母, }
。对此的任何帮助将不胜感激。
最佳答案
这感觉有点像家庭作业问题。因此,我不会发布完整的答案,但会尝试给出一些提示:要匹配的字符组在方括号 [adfg]
之间给出。将匹配任何字母 a、d、f 或 g。 [adfg]{3,}
将匹配至少包含 3 个这些字母的任何部分。查看您的单词列表,您只想匹配整行。如果您通过re.MULTILINE
作为 re.compile
的第二个参数, ^
将匹配开头和 $
一行的末尾。
添加:
如果字符只能按给定的顺序出现并假设每个字符可以出现任意次数:'qw*e*r*t*y*u*y*t*r*e*s*d*f*t*y*u*i*o*k*n*n'
。但是,我们还必须总共至少有 5 个角色。积极的回顾断言 (?<=\w{5})
添加到最后将确保这一点。
关于python - 使用正则表达式匹配单词 (Python 3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40602012/