3

使用 Python,您可以在替换文本之前检查组是否为空?

例子:

[user] John Marshal   -->   [user]<br><strong>Jonh Marshal<strong>

John Marshal   -->   <strong>Jonh Marshal<strong>

正则表达式应该使用 this is,但只有在找到组 1 时才使用“条件”插入 <br>。

title = re.sub(r'^\s*(\[.*?\])?\s*(.*)', r'\1<br><strong>\2</strong>', title)
4

2 回答 2

9

始终找到第一组,因为您允许空匹配项。

您想匹配至少一个字符,而不是 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>'
于 2013-07-04T19:04:55.657 回答
0

为了在 Python 中使用正则表达式进行条件替换,我提出了以下解决方案:

@classmethod
def normalize_query_string(cls, query_string):

    def replace_fields(match):
        x = match.group("field")
        if x == "$certHash":
            return "ci.C.H:"
        return "{}:".format(x)

    result = re.sub(r"(?P<field>\$[\w.]+):", replace_fields, query_string)
    return result
于 2019-06-06T09:34:02.920 回答