如何在Python中编写匹配带间隔重复相同字符的可调正则表达式?
Python正则匹配带间隔的连续相同字符
需求说明
需要编写正则表达式,匹配连续的相同非空白字符,字符之间可穿插任意数量的空格或换行符,且相同字符的数量支持灵活调整。
匹配示例(以字符e为例)
- 需匹配的情况:
eee(无间隔的连续相同字符)e e e(空格间隔的相同字符)- 多行间隔的相同字符:
e e e
- 不匹配的情况:
ebe(中间夹不同字符)e b e(中间夹其他非目标字符)e e(仅2个相同字符,未达最低数量要求)
现有表达式的问题
你尝试的这两个表达式:
(\S)[\s\n]*\1{2} (\S)(?:\s|\n)*\1{2}
存在局限性:它们只能匹配「第一个非空白字符 + 任意空白 + 连续两个无空白的相同字符」,无法处理每个相同字符之间都穿插空白的场景(比如e e e),因为表达式要求后面的相同字符必须连续无间隔。
正确的正则实现
基础版(匹配至少N个相同字符,N可调整)
若要匹配至少3个相同字符,使用以下表达式:
(\S)(?:\s*\1){2,}
- 规则解释:
(\S):捕获一个非空白字符作为基准目标(?:\s*\1):非捕获组,匹配「任意数量空白 + 基准字符」的组合{2,}:要求该组合至少出现2次,加上最开始的1个字符,总数量即为至少3个
精确匹配版(匹配恰好M个相同字符)
如果需要精确匹配M个相同字符(比如恰好3个),只需修改数量限定符:
(\S)(?:\s*\1){2}
将{2,}改为{2},对应总数量为1+2=3个。
Python代码示例
import re # 这里设置匹配至少3个相同字符,可修改{2,}中的数字调整数量 pattern = r'(\S)(?:\s*\1){2,}' test_cases = [ 'eee', 'e e e', '''e e e''', 'ebe', 'e b e', 'e e' ] for case in test_cases: match_result = re.search(pattern, case) print(f"测试内容: {repr(case)}") print(f"匹配结果: {'匹配成功' if match_result else '匹配失败'}\n")
补充说明
\s已经包含了空格、换行、制表符等所有空白类型,无需额外单独写\n- 如果需要调整匹配的字符范围(比如允许包含空白),可将
\S替换为对应范围,比如用.匹配任意字符(需配合re.DOTALL标志让.包含换行)
内容的提问来源于stack exchange,提问作者Rex
相关产品推荐
相关产品推荐

