使用正则匹配形如xyxy的字符串
前言
今天日常刷题,遇到网易的一道笔试题。看到了大神的思路,正则用的飞起,真是佩服。在此记录一下。
问题
给一个字符串,检查字符串是否存在形如xyxy的子序列。存在返回True
,不存在返回False
。
有两点需要解释下:
1. x可以和y相同
2. 由于找的是子序列,所以只要保证四个字符的相对次序正确即视为存在。例如:AABCADB中存在子序列ABAB
核心思路
使用正则表达式r'.*(.).*(.).*(\1).*(\2).*'
进行匹配即可,能匹配到就返回True
,不能匹配到就返回False
。
这里主要用到正则表达式的一个小知识点,就是匹配之前匹配到的分组。
\1, \2, \3
依次匹配之前匹配到的第一个,第二个,第三个分组的内容,后面按照需要你还可以匹配第四个,第五个等等分组。
具体解法
假设s
为需要检查的字符串,则代码如下:
import re
def func(s):
"""检查字符串s中是否包含xyxy形式的子序列"""
if not s or len(s) < 4:
return False
m = re.match(r'.*(.).*(.).*(\1).*(\2).*', s)
return m is not None
图省事的各位大佬直接调用func
即可
测试
测试代码如下:
def test_0():
src = 'ABAB'
expect = True
assert func(src) is expect
def test_1():
src = 'NABCBFAHB'
expect = True
assert func(src) is expect
def test_2():
src = 'AB'
expect = False
assert func(src) is expect
def test_3():
src = 'ABCDE'
expect = False
assert func(src) is expect
直接调用各个函数,或者使用pytest
批量调用就可以
pytest
执行结果如下:
总结
果然字符串处理,正则才是王道。