2016-11-18 44 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