如何使Python字符串非贪婪地匹配?

如何使Python字符串非贪婪地匹配?,python,string,string-matching,Python,String,String Matching,给定一个如下所示的文本文件: 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 我试着想了很多不同的方法让字符串三星Galaxy S6与三星Galaxy S6 ed

给定一个如下所示的文本文件:

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
我试着想了很多不同的方法让字符串三星Galaxy S6与三星Galaxy S6 edge不匹配,但似乎找不到一种可行的方法。在字符串中没有一点可以清楚地看出手机的名称已经结束,而无关的信息开始了,因此以这种方式拆分它们并与字典或类似的东西进行比较是行不通的

我试着想办法写以下内容:

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
也许吧


这样一来,三星Galaxy s6 Edge将在您的支票中排在三星Galaxy之前,您将与最长的支票相匹配。。。不需要像regex答案那样对电话列表有更多的了解

先对手机进行分类,这样它就可以按长度查看手机了

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
也许吧


这样一来,三星Galaxy s6 Edge将在您的支票中排在三星Galaxy之前,您将与最长的支票相匹配。。。如果不需要像regex答案那样对您的电话列表有更多的了解,那么消极的前瞻就可以了:

Samsung Galaxy S6(?! edge)

请参阅。

负前瞻将执行以下操作:

Samsung Galaxy S6(?! edge)

这实际上计算了同时也是线路成员的手机的成员数。然后我们只需检查一下,确保号码是1


这实际上计算了同时也是线路成员的手机的成员数。然后我们检查一下,确保数字是1。

我不明白你的问题是什么。考虑到你说的文本文件,你想做什么?你是说你也得到了三星Galaxy S6字符串,想看看它与哪一行匹配?或者您想从每一行提取电话名?您可以使用一个负前瞻:if sum1 for phone in phones if phone in line==1:@BrenBarn理想情况下,我想从给定电话名列表的不同字符串中提取每一行的电话名。我遇到的问题是,像三星Galaxy S6这样的字符串与三星Galaxy S6、三星Galaxy S6 Edge等行匹配。您也可以按长度对手机名称列表进行排序,首先是较长的名称,所以当你按顺序匹配它们时,你知道如果一个匹配了,那么一个已经匹配了。我不明白你的问题是什么。考虑到你说的文本文件,你想做什么?你是说你也得到了三星Galaxy S6字符串,想看看它与哪一行匹配?或者您想从每一行提取电话名?您可以使用一个负前瞻:if sum1 for phone in phones if phone in line==1:@BrenBarn理想情况下,我想从给定电话名列表的不同字符串中提取每一行的电话名。我遇到的问题是,像三星Galaxy S6这样的字符串与三星Galaxy S6、三星Galaxy S6 Edge等行匹配。您也可以按长度对手机名称列表进行排序,首先是较长的名称,所以当你按顺序匹配它们时,你知道如果一个匹配了,那么一个已经匹配了。我不确定这是否真的符合OP的要求。。。他想要最好的比赛,我想。。。他不想把三星Galaxy和三星Galaxy S6相提并论,至少这是我的解释:P我刚才看到了OP的评论事实上是的,我错了@乔兰比斯利是正确的。我不确定这是否真的符合OP的要求。。。他想要最好的比赛,我想。。。他不想把三星Galaxy和三星Galaxy S6相提并论,至少这是我的解释:P我刚才看到了OP的评论事实上是的,我错了@乔兰比斯利是对的。很好的答案+1。。。虽然我想起一句谚语。。。有些事,现在我有两个问题:P@JoranBeasley字体我知道你的意思。。。现在我有两个问题-如何利用我的空闲时间?很好的答案+1。。。虽然我想起一句谚语。。。有些事,现在我有两个问题:P@JoranBeasley字体我知道你的意思。。。现在我有两个问题——如何利用我的空闲时间?