This page has a good example of doing rule based renderer via python:
Rule-based renderer
The rule-based renderer styles features using a list of rules, defined
by expressions. The rules are processed sequentially, with the first
matching rule used to render a feature.
The example below defines a new rule-based renderer for different
kinds of road features. Major roads are shown in orange, minor roads
are shown in black at scales larger than 1:2,500 and residential roads
are shown in grey at scales between 1:100 and 1:1,000.
# define some rules: label, expression, color name, (min scale, max scale)
road_rules = (
('Major road', '"type" LIKE \'major\'', 'orange', None),
('Minor road', '"type" LIKE \'minor\'', 'black', (0.0, 2500.0,)),
('Residential road', '"type" LIKE \'residential\'', 'grey', (100.0, 1000.0,)),
)
# create a new rule-based renderer
symbol = QgsSymbolV2.defaultSymbol(layer.geometryType())
renderer = QgsRuleBasedRendererV2(symbol)
# get the "root" rule
root_rule = renderer.rootRule()
for label, expression, color_name, scale in road_rules:
# create a clone (i.e. a copy) of the default rule
rule = root_rule.children()[0].clone()
# set the label, expression and color
rule.setLabel(label)
rule.setFilterExpression(expression)
rule.symbol().setColor(QColor(color_name))
# set the scale limits if they have been specified
if scale is not None:
rule.setScaleMinDenom(scale[0])
rule.setScaleMaxDenom(scale[1])
# append the rule to the list of rules
root_rule.appendChild(rule)
# delete the default rule
root_rule.removeChildAt(0)
# apply the renderer to the layer
layer.setRendererV2(renderer)