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

空の一致を許可するため、グループ 1 は常に検出されます。

0 個以上ではなく、少なくとも 1 個の文字に一致させたいので、次を使用します.+?

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

グループ 1 が欠落している場合、一致は例外をスローするようになりました。それを利用します:

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 に答える