【问题标题】:how can I make my Python string match non-greedily?如何使我的 Python 字符串不贪婪地匹配?
【发布时间】:2016-11-18 20:16:35
【问题描述】:

给定一个看起来像这样的文本文件:

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

我尝试了多种不同的方法来使字符串Samsung Galaxy S6Samsung 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')

但我想不出正确的结构方式 - 有人有什么想法吗?我确定我在这里遗漏了一些简单的东西,但就是不知道是什么。

【问题讨论】:

  • 我不明白你的问题是什么。给定你说的文本文件,你想做什么?你是说你也得到了字符串“Samsung Galaxy S6”并想看看它匹配哪些行?或者您想从每一行中提取电话名称?
  • 您可以使用负前瞻:Samsung Galaxy S6(?! edge)
  • if sum(1 for phone in phones if phone in line) == 1:
  • @BrenBarn 理想情况下,我想从给定电话名称列表的不同字符串中从每行中提取电话名称。我遇到的问题是“Samsung Galaxy S6”之类的字符串与“Samsung Galaxy S6”、“Samsung Galaxy S6 Edge”等行匹配。
  • 您还可以按长度对电话名称列表进行排序,名称较长的在前,这样当您匹配它们时,您就知道如果一个匹配不再匹配。

标签: python string string-matching


【解决方案1】:

首先对您的手机进行排序,以便按长度查看它们

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

也许?

这样,“Samsung Galaxy s6 Edge”在您的支票中排在“Samsung Galaxy”之前,您将匹配最长的一个...而不需要像正则表达式答案那样更多地了解您的电话列表

【讨论】:

    【解决方案2】:

    否定的前瞻将做:

    Samsung Galaxy S6(?! edge)
    

    a demo on regex101.com

    【讨论】:

    • 很好的答案+1 ...虽然我想起了一句话...“某事某事,现在我有2个问题”:P
    • @JoranBeasley:我知道你的意思......“现在我有两个问题 - 我的空闲时间该怎么办?”
    【解决方案3】:
    if sum(1 for phone in phones if phone in line) == 1:
    

    这实际上计算了phones 的成员同时也是line 的成员。然后我们只需检查以确保数字为 1。

    【讨论】:

    • 我不确定这是否真的符合 OP 的要求……他想要我认为的最佳匹配……他不想将“Samsung Galaxy”与“Samsung Galaxy S6”匹配(至少那是我的解释)与否:P(我刚刚看到OP的评论)
    • 其实是的,我弄错了。 @JoranBeasley 是正确的。
    猜你喜欢
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    相关资源
    最近更新 更多