2016-11-18 24 views
1

給定一個文本文件,它看起來像這樣:我一直在努力,想了許多不同的方式有弦Samsung Galaxy S6不匹配Samsung Galaxy S6 edge我怎樣才能讓我的Python字符串非貪婪地匹配?

Samsung Galaxy S6 active SM-G890A 32GB Camo White (AT&T) *AS-IS* Cracked Screen 
Samsung Galaxy S6 SM-G920 - 32GB - White Verizon Cracked screen 
Samsung Galaxy S6 edge as is cracked screen 

,但似乎無法想出一個辦法這樣可行。在字符串中沒有意義的地方是電話的名稱已經結束,並且無關的信息開始了,所以將它們分開並與字典或類似的東西比較是行不通的。

我試圖想一些辦法來寫:

phones = ['Samsung Galaxy S6', 'Samsung Galaxy S6 Edge'] 
lines = open('phones.txt', 'r').readlines() 
for line in lines: 
    for phone in phones: 
     if phone in line and no other phone in phones is in line: 
      print('match found') 

,但我想不出來構建正確的方式 - 人有什麼想法?我敢肯定,我在這裏錯過了一些簡單的東西,但只是無法弄清楚什麼。通過排序您的手機,這樣它會看他們的長度

phones.sort(key=len,reverse=True) 

再突破,當你發現一個匹配

for phone in phones: 
    if phone in line: 
     print "FOUND:",repr(phone),"IN",repr(line) 
     break # we dont need to keep looking for other phones in this line 

也許

+0

我不明白你的問題是什麼。鑑於你所說的文本文件,你想做什麼?你是否說你還得到了字符串「三星Galaxy S6」,並想看看它匹配哪條線?或者你想從每一行中提取電話名稱? – BrenBarn

+0

您可以使用負面預測:[**'Samsung Galaxy S6(?! edge)'**](https://regex101.com/r/U6kKYZ/1) – Jan

+0

'如果sum(1 for phone in phones if電話線)== 1:'< - 檢查是否有一種電話在線。 –

回答

3

開始?

這樣「三星Galaxy S6邊緣」在你的支票來「三星Galaxy」之前,你會匹配最長的一個...不requireing您的電話清單的更多的知識,如正則表達式的答案

+0

非常感謝你! – n1c9

3

負前瞻將會這樣做:

Samsung Galaxy S6(?! edge) 

請參閱a demo on regex101.com

+0

偉大的答案+1 ...雖然我想起了一個說法......「有些事情,現在我有2個問題」:P –

+0

@JoranBeasley:我知道你的意思是......「現在我有2個問題 - 什麼我的空閒時間呢?「 – Jan

+0

:P洛爾這不是我想的那個:P –

1
if sum(1 for phone in phones if phone in line) == 1: 

這實際上會統計也line成員phones成員。然後我們檢查一下,確保這個數字是1。

+0

即時通訊不知道這實際上做的是OP想要的......他想要我認爲的最佳匹配......他不想匹配「三星Galaxy」agains「三星Galaxy S6「(至少這是我的解釋)或不:P(我剛剛看到OP的評論) –

+1

其實是的,我錯了。 @JoranBeasley是對的。 – n1c9