python - 使用正则表达式匹配单词 (Python 3)

标签 python regex pattern-matching

我已经盯着这个问题几个小时了,我不知道使用什么正则表达式格式来解决这个问题。

问题:

给定以下输入字符串,找到所有可能的 5 个字符或更长的输出单词。

  1. qwertyuytresdftyuioknn
  2. gijakjthoijerjidsdfnokg

您的程序应该找到可以从提供的字符串派生的所有可能的单词(5 个以上字符)。 使用http://norvig.com/ngrams/enable1.txt作为您的搜索词典。 输出单词的顺序并不重要。

  1. 女王问题
  2. 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/

相关文章:

python - 从向量化的二维数组中获取值

php - 在 PHP 中打印没有嵌套循环的模式

正则表达式-匹配字符串时不带前导和尾随空格

数组中用于模式匹配的 JavaScript 占位符

scala - Scala 中无法解释的理解结果

Ruby 正则表达式组匹配,在 1 行上分配变量

python - 用空格填充列表元素给定最小长度

python - 如何在 drf-yasg swagger_auto_schema request_body 上指定示例值?

python - 更多 Pythonic/Pandaic 方法循环遍历 pandas 系列

iOS正则表达式阿拉伯语