Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将string1的最长子字符串与string2匹配的正则表达式_Python_Regex_Substring - Fatal编程技术网

Python 将string1的最长子字符串与string2匹配的正则表达式

Python 将string1的最长子字符串与string2匹配的正则表达式,python,regex,substring,Python,Regex,Substring,我有两条线a和b。我想要一个正则表达式模式,这样它就可以将b的最长子串与a开头的a相匹配 比如说, a = "aaaabaaa" b = "aaazb" answer_i_need = "aaa" 例2 a = "aaaabaaa" b = "aaaa" answer_i_need = "aaaa" a = "aaaabaaa" b = "baaa" answer_i_need = "" 例2 a = "aaaabaaa" b = "aaaa" answer_i_need =

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

比如说,

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

a = "aaaabaaa"
b = "aaaa"
answer_i_need = "aaaa"      
a = "aaaabaaa"
b = "baaa"
answer_i_need = "" 
例2

a = "aaaabaaa"
b = "aaaa"
answer_i_need = "aaaa"      
a = "aaaabaaa"
b = "baaa"
answer_i_need = "" 
我知道查找b的所有子字符串并检查它是否与a匹配的选项,但这将花费太长的时间,因为字符串非常长,而且我正在使用Python。 老实说,我不确定这是否可能,无论如何,如果我能找到这样一个解决方案,我将非常感激


编辑:在OP中需要一个优雅的答案,而我处理的是很长的字符串(将近100000个字符),所以我想知道最有效的答案

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

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

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中的一个为空字符串的情况。

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

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

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中的一个是空字符串的情况是需要的。

很抱歉,我没有遇到这个问题,让我读一下并回答。@DSM老实说,我没有在链接中找到我想要的答案,因为OP需要一个优雅的答案,而我需要一个高效的答案。因此,在那里发布的大多数答案都不清楚它们的效率有多高。@coding_-pleasures所以看看这些答案,自己测试一下,看看哪一个是数据中最快的。如果我们都为您测试它,我们可能会在不同的情况下得到不同的结果。@DSM您的答案os.path.commonprefix()非常适合我的需要。使用
os.path.commonprefix()
是个好主意,我不知道它的存在。然而,根据我对长度为1
000和4
720`000的两个字符串所做的测试,
commonprefix()
比我的解决方案多花费大约15%的时间来执行。我想你说它满足你的需求是出于效率以外的其他原因。很抱歉,我没有遇到这个问题,让我阅读并回答。@DSM说实话,我没有在那个链接中找到我想要的答案,因为OP需要一个优雅的答案,而我需要一个高效的答案。因此,在那里发布的大多数答案都不清楚它们的效率有多高。@coding_-pleasures所以看看这些答案,自己测试一下,看看哪一个是数据中最快的。如果我们都为您测试它,我们可能会在不同的情况下得到不同的结果。@DSM您的答案os.path.commonprefix()非常适合我的需要。使用
os.path.commonprefix()
是个好主意,我不知道它的存在。然而,根据我对长度为1
000和4
720`000的两个字符串所做的测试,
commonprefix()
比我的解决方案多花费大约15%的时间来执行。我想你说它满足你的需求是因为效率以外的其他原因。谢谢你的回答,但不幸的是,当字符串变得很长(大约100000个字符长)时,这个答案有点太低效了。这就是为什么我希望正则表达式可以在这方面帮助我。我认为正则表达式完全不适合这个问题。我没有其他的想法,不仅是速度有多快,甚至和我的代码有多大的不同。我刚刚尝试在代码中使用enumerate()或izip(),但速度较慢。我渴望看到有人提出比我更好的解决方案。在我看来,剩下的唯一可能性是在CAs@eyquem中编写函数,我认为在这里使用正则表达式不会提高性能。对于正则表达式来说,要解决这个问题,它必须进行大量的回溯。像上面这样的简单循环似乎是最好的选择。@DSM提到的线程展示了一个很好的正则表达式解决方案。您将编写更少的代码,但比上面这样的简单循环要慢得多。@Francis是的,我已经阅读了引用线程中的答案,他们说他们的解决方案效率不高。因此,我认为在使用正则表达式获得更好的神奇解决方案后,不能再等待了。感谢您的回答,但不幸的是,当字符串变得很长(大约100000个字符长)时,这个答案的效率太低了。这就是为什么我希望正则表达式可以在这方面帮助我。我认为正则表达式完全不适合这个问题。我没有其他的想法,不仅是速度有多快,甚至和我的代码有多大的不同。我刚刚尝试在代码中使用enumerate()或izip(),但速度较慢。我渴望看到有人提出比我更好的解决方案。在我看来,剩下的唯一可能性是在CAs@eyquem中编写函数,我认为在这里使用正则表达式不会提高性能。对于正则表达式来说,要解决这个问题,它必须进行大量的回溯。像上面这样的简单循环似乎是最好的选择。@DSM提到的线程展示了一个很好的正则表达式解决方案。您将编写更少的代码,但比上面这样的简单循环要慢得多。@Francis是的,我已经阅读了引用线程中的答案,他们说他们的解决方案效率不高。因此,我认为,在使用正则表达式获得更好的神奇解决方案之后,我们不能再等待了。