前面的正则匹配规则表中说过:
(...) 被括起来的表达式将作为分组,每遇到一个左括号(,分组编号+1。
表示正则表达式中的分组通过从左到右计算其开括号来编号。
例如表达式 ((A)(B(C))) 存在四个分组:
1 ((A)(B(C)))
2 (A)
3 (B(C))
4 (C)
而组0始终代表整个表达式 ((A)(B(C)))。
match_obj = re.match("((\w)(\w(\w)))", "ABC")
print(match_obj.groups())
print(match_obj.group(0))
结果:
('ABC', 'A', 'BC', 'C') ABC
分组表达式可接数量词,|仅对当前分组有效
又是什么含义呢?
假如我们有一批字符串:
brands = [
"联想/LENOVO",
"狮乐/SHILE",
"美的/Midea",
"联想/LENOVO",
"松下/Panasonic",
"红叶/RedLeaf", "纳米亚",
"富士施乐/FujiXerox",
"佳印",
"佳能/CANON",
"TCL"
]
我们希望提取每个品牌的中文名称和英文名称,但是可能有些品牌只有中文名称,或者只有英文名称。
这时我们可以在对应的分组加上数量词?表示可能出现一次也可能不出现:
for brand in brands:
print(brand, re.match(r"([^\w/]+)?/?(\w+)?", brand, re.A).groups())
结果:
联想/LENOVO ('联想', 'LENOVO')
狮乐/SHILE ('狮乐', 'SHILE')
美的/Midea ('美的', 'Midea')
联想/LENOVO ('联想', 'LENOVO')
松下/Panasonic ('松下', 'Panasonic')
红叶/RedLeaf ('红叶', 'RedLeaf')
纳米亚 ('纳米亚', None)
富士施乐/FujiXerox ('富士施乐', 'FujiXerox')
佳印 ('佳印', None)
佳能/CANON ('佳能', 'CANON')
TCL (None, 'TCL')
这样就顺利的匹配到每个品牌对应的中文名称和英文名称。