始终找到第一组,因为您允许空匹配项。
您想匹配至少一个字符,而不是 0 或更多,所以使用.+?
:
title = re.sub(r'^\s*(\[.+?\])?\s*(.*)', r'\1<br><strong>\2</strong>', title)
现在,如果缺少第一组,比赛将引发异常。利用它:
try:
title = re.sub(r'^\s*(\[.+?\])?\s*(.*)', r'\1<br><strong>\2</strong>', title)
except re.error:
title = re.sub(r'^\s*(.*)', r'<strong>\1</strong>', title)
另一种方法是使用函数进行替换:
def title_sub(match):
if match.group(1):
return '{}<br><strong>{}</strong>'.format(*match.groups())
return '<strong>{}</strong>'.format(match.group(2))
title = re.sub(r'^\s*(\[.+?\])?\s*(.*)', title_sub, title)
演示:
>>> re.sub(r'^\s*(\[.+?\])?\s*(.*)', title_sub, '[user] John Marshal')
'[user]<br><strong>John Marshal</strong>'
>>> re.sub(r'^\s*(\[.+?\])?\s*(.*)', title_sub, 'John Marshal')
'<strong>John Marshal</strong>'