如何使用Python正则匹配任意相邻重复的字符串?
如何使用Python正则匹配任意相邻重复的字符串?
嗨,我来帮你搞定这个需求!针对你要找**相邻且连续重复两次(中间无间隔)**的字符串,用Python的re模块就能轻松实现,下面给你一步步讲清楚:
核心正则表达式
首先直接上能用的正则:r'(.+)\1'
我给你拆解一下每个部分的作用:
(.+):这是一个捕获组,.+表示匹配任意非换行的字符(至少1个,毕竟要重复的内容总不能是空的),刚好符合你说的“在一行内”的要求。\1:这是反向引用,意思是“完全重复第一个捕获组匹配到的内容”,这样就保证了前后两段是完全相同的相邻重复。
匹配你给出的示例
拿你举的几个例子测试一下:
FooFoo:捕获组会抓到Foo,\1精准匹配后面的Foo,完美命中;Bar 1Bar 1:捕获组抓Bar 1,后面的Bar 1和它完全一致,匹配成功;X1 Y2 Z3X1 Y2 Z3:同理,捕获组捕获X1 Y2 Z3,后面的重复部分刚好匹配。
Python代码示例
给你写个实际运行的代码片段,你可以直接测试:
import re # 测试用的字符串列表,包含你的示例和几个测试用例 test_cases = [ "FooFoo", "Bar 1Bar 1", "X1 Y2 Z3X1 Y2 Z3", "HelloWorld", # 这个不会匹配,因为前后没有重复 "AbcAbcAbc" # 会匹配前6个字符"AbcAbc" ] # 定义正则模式 pattern = r'(.+)\1' for case in test_cases: # 查找所有匹配的重复单元 matches = re.findall(pattern, case) if matches: print(f"在 '{case}' 中找到重复单元: {matches[0]}") # 如果想获取完整的重复字符串(比如"FooFoo"而不是"Foo"),可以用search取group(0) full_match = re.search(pattern, case).group(0) print(f"完整的重复字符串: {full_match}\n") else: print(f"'{case}' 中没有找到相邻重复的内容\n")
额外补充几个实用细节
- 获取完整重复字符串:如果你想要拿到整个重复的字符串(比如
FooFoo)而不是重复的单元(Foo),可以用re.search()获取匹配对象,然后调用group(0),就像上面代码里演示的那样。 - 贪婪/非贪婪匹配:默认的
(.+)是贪婪模式,会尽可能匹配最长的重复单元。如果想要匹配最短的(比如在aaaaa中优先匹配aa而不是aaaa),可以改成非贪婪模式r'(.+?)\1'。 - 匹配包含换行的情况:虽然你说内容在一行内,但如果之后需要处理跨换行的重复,可以加上
re.DOTALL标志,让.能匹配换行符,比如re.search(pattern, text, re.DOTALL)。
备注:内容来源于stack exchange,提问作者Vegetable New Man
相关产品推荐
相关产品推荐

