Python中是否可以用正则表达式匹配形状相似字符串?

京东的一道笔试题
输入样例:
字符串A: ababcb
字符串B: xyx
子字符串A的子字符串aba,bab,bcb与字符串B形状等价,我们是要求出A中有多少个子字符串与字符串B等价。
(显然,字符串A的长度大于等于字符串B的长度,等号的情况举例:字符串A:abcc,字符串B:xyaa)
提示中import re,那应该是可以用正则来实现?

阅读 2.9k
2 个回答

python3

>>> import re
>>> def ptn(s):
    l = []
    t = set()
    for c in s:
        if c not in t:
            l.append(r'(?P<%s>\w)' % c)
            t.add(c)
        else:
            l.append(r'(?P=%s)' % c)
    return '(?=(%s))' % ''.join(l)

>>> def 模式匹配(字符串, 模式):
    return [x[0] for x in re.compile(ptn(模式)).findall(字符串)]

>>> 模式匹配('ababcb', 'xyx')
['aba', 'bab', 'bcb']
>>> 模式匹配('abcc', 'xyaa')
['abcc']
>>> 
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File  : 02.py
# @Author: huifer
# @Date  : 2018/9/10

def indexOfEm(str_b):
    # 获取索引对应字母
    set_b = set(str_b)
    en_numb = dict()
    for i, e in enumerate(set_b):
        en_numb[e] = i
    return en_numb


def strToNumb(str_b):
    # 把 xyx 更换成数字
    en_numb = indexOfEm(str_b)
    new_b = list(str_b)
    new_str = [en_numb.get(i) for i in new_b]
    return new_str


def splitJoinStr(str_a, str_b):
    # 根据 文本b切割
    str_a = list(str_a)
    str_b = list(str_b)
    split_len = len(str_b)

    res = list()

    for i in range(str_a.__len__()):
        a = str_a[i:split_len + i]
        if a.__len__() == split_len:
            res.append(a)

    return res

def xtoy(str_b):
    # 交换位置 
    a = str_b.replace("x","z").replace("y","x").replace("z","y")
    return a



if __name__ == '__main__':
    str_a = "ababcb"
    str_b = "xyx"

    str_b_2 = xtoy(str_b)


    # 标准
    standard = strToNumb(str_b)
    standard_2 = strToNumb(str_b_2)
    print("标准为", standard)
    print("标准为", standard_2)

    # 切割后文本
    split_str = splitJoinStr(str_a, str_b)
    for i in split_str:
        # 当前预估值
        da = strToNumb(i)
        # print(da)
        if da == standard or da ==standard_2:
            print("通过",i)

不知道结果是否符合你的想法

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题