a (a + b) + a^2 + a b + 1/(a (a + b)) +
1/(a^2 + a b) //. {a (a + b) :> Exp1, a^p_ (a + b)^p_ :> Exp1^p,
Plus[a^2, a b, q___] :> Plus[Exp1, q]}
如果不想用算术的那些函数估计你的问题一变,还得增加rule。因为这些rule都太特殊了,很多时候形式一变就不能用了,全都得看他fullform。
根据FullForm写的大概思路就是先查看这个表达式的FullForm,然后根据他的结构自己写建立相应的pattern,然后可以用MatchQ判断一下对不对。还要考虑最外面函数的Head和性质(比如说这里的plus就有orderless)。因为同类项合并之后前面会产生系数,原来的表达式中的单个字母什么的会被分开放入Times,取倒数也会被分开放入Power,这些都是要考虑的。