0 を追加する前に数値をキャプチャして長さを確認できますが、代わりにこれを使用できる場合があります。
import re
txt = 'file8, file9, file10'
pat = r"(?<!\d)(\d)(?=,|$)"
regexp = re.compile(pat)
print(regexp.sub(r"0\1", txt))
正規表現101のデモ
(?<! ... )
を否定後読みと呼びます。これにより、パターンの後のパターンが否定後読みのパターンに一致する場合、(否定的な) 一致が防止されます。たとえば、前にがある場合を除き、文字列内の(?<!a)b
すべてに一致します。つまり、一致しますが、一致しません。したがって、前に別の数字がない限り、数字に一致します。b
a
bb
cb
ab
(?<!\d)(\d)
(\d)
単一の数字で、キャプチャ グループに囲まれ、単純な括弧で示されます。キャプチャされたグループは、最初のキャプチャ グループに格納されます。
(?= ... )
前向きな先読みです。これは、肯定先読み内のパターンが、この肯定先読みの前のパターンの後に一致する場合にのみ一致します。つまり、後にa がある場合にのみ、文字列内のa(?=b)
すべてに一致します。一致するかどうか。a
b
ab
ac
aa
(?=,|$)
,|$
コンマまたは文字列の末尾のいずれかを意味する肯定的な先読みです。
(?<!\d)(\d)(?=,|$)
したがって、その前に数字がなく、その後にカンマがある限り、またはその数字が文字列の末尾にある限り、任意の数字と一致します。