Python中如何使用re模块匹配类似a^nba^n这样的字符串?
该公式指的是,在 b 的前后有相同个数的 n。 n 不是具体值,所以关键点在于相同个数而非指定个数。 已知 Perl 是可以的,好奇 python 的 re 库可否实现?
Python中如何使用re模块匹配类似a^nba^n这样的字符串?
12 回复
更正一下,有个 typo…相同个数的 a。
import re
def match_balanced_string(s):
"""
匹配形式为 a^n b a^n 的字符串,其中n≥1
例如:aba, aabaa, aaabaaa 等
"""
# 使用命名分组和反向引用
pattern = r'^(?P<prefix>a+?)b(?P=prefix)$'
match = re.match(pattern, s)
if match:
return True, f"匹配成功: n={len(match.group('prefix'))}"
return False, "不匹配"
# 测试用例
test_strings = [
"aba", # 匹配: n=1
"aabaa", # 匹配: n=2
"aaabaaa", # 匹配: n=3
"ab", # 不匹配: 缺少后面的a
"ba", # 不匹配: 缺少前面的a
"abc", # 不匹配: 字符不符
"aaabaa", # 不匹配: 前后a数量不等
]
for s in test_strings:
result, msg = match_balanced_string(s)
print(f"'{s}': {msg}")
核心要点:
(?P<prefix>a+?)创建命名分组匹配前面的a序列(非贪婪匹配)b匹配中间的单个b字符(?P=prefix)反向引用确保前后a序列完全相同^和$确保匹配整个字符串
注意: 正则表达式无法真正计数,这里利用反向引用确保前后分组内容完全相同。
一句话建议: 用命名分组加反向引用来匹配这种对称结构。
(a+)b\1 不就行了吗,不过前后需要指定边界
按照计算理论来说,正则语法是 3 型语法,而 a^nba^n 是典型的 2 型语法。而且 2 型语法是 3 型语法的超集。所以理论上来说是匹配不了的。
这里\1 指的是第一个括号对吧?我试一下,因为之前找到 re 里对这种写法的定义…
嗯,这是没错的,但编程语言里的 re 不是真正的正则语言,所以概念上不能直接和 CFL 比较
但是 Python 的 re 是可以的。用\1 表示第一个捕获组。
感谢感谢!
哇,这怎么实现
所以 regex 这个名字还是挺有误导性的 hhh
印象中 regex 是能够匹配到 CSL 的,但是等价不等价就不知道了……


