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