2016-11-15 84 views
1

我一直在盯着這個問題好幾個小時,我不知道用什麼正則表達式格式來解決這個問題。用正則表達式匹配單詞(Python 3)

問題:

鑑於以下的輸入字符串,查找所有可能的輸出字5個字符或更長的時間。

  1. qwertyuytresdftyuioknn
  2. gijakjthoijerjidsdfnokg

你的程序應該發現,可以從提供的字符串中導出的所有可能的單詞(5+字符)。 使用http://norvig.com/ngrams/enable1.txt作爲您的搜索字典。 輸出詞的順序無關緊要。

  1. 皇后問題
  2. gaeing garring聚會門geeing gieing去 戈林對輸入字符串

假設:

  • QWERTY鍵盤
  • 小寫AZ而已,沒有空格或標點符號
  • 輸入字符串的第一個和最後一個字符將始終匹配 所需輸出字的第一個和最後一個字符。
  • 不要假設用戶採取字母
  • 輸出字的每個字母之間的最有效的路徑將出現在輸入字符串

嘗試的解決方案:

首先我下載的了從該網頁中的文字並將它們存儲在我的計算機中的一個文件中('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,}做。任何幫助到這將不勝感激。

回答

1

這感覺有點像家庭作業問題。因此,我不會發表完整的答案,但會嘗試給出一些提示:要匹配的字符組在方括號[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})添加到結束將確保。

+0

https://www.reddit.com/r/dailyprogrammer/comments/53ijnb/20160919_challenge_284_easy_wandering_fingers/ \t 它實際上是從reddit的只是實踐的一個挑戰。 – tadm123

+0

彼得,但我需要匹配從左向右掃字的字母......'[adfg] {3,}以任意順序匹配字母。 – tadm123

+0

從pythons正則表達式文檔:'(?<= ...)'匹配如果字符串中的當前位置前面是匹配...,匹配結束於當前位置。因此,我們可以得到如下的結論:(1)()()()()() 4})n $'? – Peter