【问题标题】:Regex that will match the longest possible substring of a string1 with the string2 [duplicate]将 string1 的最长可能子字符串与 string2 匹配的正则表达式 [重复]
【发布时间】:2013-05-11 14:21:28
【问题描述】:

我有两个字符串 a 和 b。我想要一个正则表达式模式,这样它将 b 的最长子字符串与 a 开头的 a 匹配。

例如,

a = "aaaabaaa"
b = "aaazb"
answer_i_need = "aaa"

示例 2,

a = "aaaabaaa"
b = "aaaa"
answer_i_need = "aaaa"      

示例 2,

a = "aaaabaaa"
b = "baaa"
answer_i_need = "" 

我知道查找 b 的所有子字符串并检查它是否与 a 匹配的选项,但是由于字符串非常长并且我使用的是 Python,所以它会花费太长时间。 老实说,我不确定这是否可能,无论如何,如果我能找到这样的解决方案,我将非常感激。

编辑:在 this question 中,OP 需要一个优雅的答案,而我正在处理非常长的字符串(几乎 100,000 个字符),所以我想知道最有效的答案。

【问题讨论】:

  • 对不起,我没有遇到这个问题,让我看一下并回复..
  • @DSM 老实说,我没有在该链接中找到我想要的答案,因为 OP 需要一个优雅的答案,而我需要一个高效的答案。因此,大多数发布的答案都不清楚它们的效率。
  • @coding_pleasures 所以看看这些答案,然后自己测试一下,看看哪个在你的数据上最快。如果我们都为您测试,我们可能会在不同的情况下得到不同的结果。
  • @DSM 你的答案 os.path.commonprefix() 非常适合我的需要。
  • 使用os.path.commonprefix()的好主意,我不知道它的存在。但是,根据我对长度为 1000 and 4720`000 的两个字符串的测试,commonprefix() 的执行时间比我的解决方案多 15% 左右。我想您说它满足您的需求是出于效率以外的其他原因。

标签: python regex substring


【解决方案1】:

我认为你让事情复杂化了。我喜欢正则表达式,但我不认为我们必须尝试将它们用于它们不适合的任务。

您的问题很容易解决,如下所示:

import re


def longest_common_beginning(a,b):
    i = 0
    for i in xrange(min(len(a),len(b))):
        if a[i]!=b[i]:
            return a[:i]
    else:
        return a[:i+1]

for a,b,ain in (("aaaabaaa","aaazb","aaa"),
                ("aaaabaaa","aaaa", "aaaa"),
                ("aaaabaaa","baaa","")):
    x = longest_common_beginning(a,b)  
    print ('a   : %r\n'
           'b   : %r\n'
           'ain : %r\n'
           'x   : %r   ain==x is %s\n'
           % (a,b,ain,x,ain==x))

i=0 用于 ab 之一为空字符串的情况。

【讨论】:

  • 感谢您的回答,但不幸的是,当字符串变得很长(大约 100,000 个字符长)时,这个答案的效率太低了。这就是为什么我希望正则表达式可以在这方面帮助我。
  • 我认为正则表达式完全不适合这个问题。而且我没有其他想法,不仅速度有多快,甚至与我的代码有多么不同。我刚刚尝试在我的代码中使用 enumerate() 或 izip() ,但速度较慢。我渴望看到有人提出比我更好的解决方案。在我看来,唯一剩下的可能性就是用 C 编写函数
  • 正如@eyquem 所说,我认为在这里使用正则表达式不会提高性能。对于一个正则表达式来解决这个问题,它必须做很多回溯。像上面这样的简单循环似乎是最好的选择。
  • @DSM 提到的线程显示了一个很好的正则表达式解决方案。您将编写更少的代码,但它会比上面的简单循环慢得多。
  • @Francis 是的,我已经阅读了引用线程中的答案,他们说他们的解决方案效率不高。因此,我认为在使用正则表达式获得更好的神奇解决方案之后,一定不要再等待了。
猜你喜欢
  • 2012-03-02
  • 2010-11-15
  • 2011-02-04
  • 2019-12-31
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
  • 2013-06-09
  • 2022-01-17
相关资源
最近更新 更多