从s中提取匹配字符串

2024-10-01 07:39:12 发布

您现在位置:Python中文网/ 问答频道 /正文

使用Python 2.7

假设我有一个模式字符串abb和一个搜索字符串abab。 我想得到模式字符串的切片部分,它尽可能从一开始就与搜索字符串匹配,也就是说,我希望表达式只返回ab,因为只有那么多的模式字符串在搜索字符串的开头。我也读过google page on regex和正则表达式howto page,但找不到方法。只要一个提示就够了。你知道吗

我已经写了下面的代码给出了正确的答案,但我正在寻找更有效的东西。你知道吗

pat_str='abb'
search_str='abab'
pat_length=len(pat_str)
for each in xrange(pat_length,0,-1):
    if re.search('^'+pat_str[:each],search_str):
        return_str=pat_str[:each]
        break

print return_str

编辑: 相应的元素应该相同。在对应元素不相同的第一个实例处中断并返回前面的字符串。你知道吗


Tags: 字符串元素searchreturnab表达式page模式
3条回答

我不确定您是否可以用正则表达式来实现这一点(不是以一种有意义的方式),但您不需要这样做;在适用于任意数量字符串的函数中实现它很简单:

def longest_match(*strings):
    match = []
    for tup in zip(*strings):
        if len(set(tup)) == 1:
            match.append(tup[0])
        else:
            break

    return ''.join(match)

print(longest_match('abc123', 'abc456'))  # abc
print(longest_match('abc123', 'abc456', 'abyz'))  # ab
print(longest_match('ababc', 'csrabab'))  # <prints empty line>

您描述的正则表达式是

(a(b(a(b?)?)?)?

您可以根据您的模式动态构建它:

import re
pattern = 'abab'
search_str = 'abb'

# Construct the regexp that I mentioned above
regexp = ''
for c in reversed(pattern):
    regexp = '(%s%s)?' % (re.escape(c), regexp)

m = re.match(regexp, search_str)
print 'Result is %r' % m.group(0)

这是假设您真的想使用正则表达式。其他答案都有很好的解决方案,无需重新考虑。你知道吗

也可以在谷歌上搜索“最长的公共字符串前缀”。你知道吗

更新:regexp错误(有点颠倒),修复了它。你知道吗

考虑到你只想在一开始就找到一个匹配的,只需压缩,比较和返回。你知道吗

from itertools import izip

def sub_match(s, sub):
    out = ""
    for a, b in izip(s, sub): # zip python3
        if a != b:
            return out
        out += a
    return out

如果要在sub中查找任何匹配项:

from itertools import islice,  izip
def sub_match(s, sub):
    all_m = []
    for i in range(len(sub)):
        out = ""
        for a, b in izip(s, islice(sub,i,None)):
            if a != b:
                all_m.append(out)
                break
            out += a
        else:
            all_m.append(out)
    return max(all_m, key=len)

输出:

In [12]: s = "csrababc"

In [13]: p =  "ababc"

In [14]: sub_match(s,p)
Out[14]: 'c'

In [15]: s = "ababdc"

In [16]: sub_match(s,p)
Out[16]: 'abab'

相关问题 更多 >