Is there a way to simplify this replacement rule

I have a rather big expression which contains many sums of form q x + w y. I know that y is much smaller than x and i want to omit it where possible, namely if both q and w are integers. So i apply the replacement rule

q_?IntegerQ x + w_?IntegerQ y -> q x


However this rule obviously doesn't work if either q or w (or both) is equal to unity because FullForm of q x contains Times and one of x doesn't. So to get replacement done i need to use the ugly set of rules

{ q_?IntegerQ x + w_?IntegerQ y -> q x , x + w_?IntegerQ y -> x , ... }


and in place of dots there are two more rules with w and both w and q omitted.

So the question is whether it is possible (in general) to somehow simplify this ugly set to anything more simple.

• BlankNullSequence or {q___?IntegerQ x + w___?IntegerQ y -> q x} Commented Sep 26, 2013 at 11:50
• Do you want 0s to match? What about q_. x + w_. y /; IntegerQ /@ And[q, w]?
– Rojo
Commented Sep 26, 2013 at 12:03
• (Better And @@ IntegerQ /@ {q, w}, otherwise q=w=True would match)
– Rojo
Commented Sep 26, 2013 at 12:17

You can take advantage of the OneIdentity attribute of Times as it affects pattern matching(1),(2),(3) by making q and w Optional. (As Rojo shows in a comment above.) Condition is then used to check the q and w matches.
{3 x + 7 y, 2 x + E y, x + 5 y} /.

{3 x, 2 x + E y, x}

Note that I used RuleDelayed rather than Rule to localize q.