我是一名 Python 初学者,所以请记住我的正则表达式技能等级为 -122。
我需要将包含 file1
文本的字符串转换为 file01
,但不将 file10
转换为 file010
.
我的程序是错误的,但这是我能得到的最接近的,我尝试了几十种组合,但我无法接近:
import re
txt = 'file8, file9, file10'
pat = r"[0-9]"
regexp = re.compile(pat)
print(regexp.sub(r"0\d", txt))
有人可以告诉我我的模式和替换有什么问题并给我一些建议吗?
最佳答案
您可以捕获数字并在添加 0 之前检查长度,但您也可以使用它:
import re
txt = 'file8, file9, file10'
pat = r"(?<!\d)(\d)(?=,|$)"
regexp = re.compile(pat)
print(regexp.sub(r"0\1", txt))
(?<! ... )
称为负向回顾。如果其后面的模式具有负向后查找中的模式匹配,则这可以防止(负)匹配。例如,(?<!a)b
将匹配所有 b
在字符串中,除非它有 a
在它之前,意思是bb
, cb
匹配,但是ab
不匹配。 (?<!\d)(\d)
因此匹配一个数字,除非它前面有另一个数字。
(\d)
是一个数字,包含在捕获组中,用简单的括号表示。捕获的组存储在第一个捕获组中。
(?= ... )
是积极的前瞻。 仅如果正向先行内的模式与此正向先行之前的模式匹配。换句话说,a(?=b)
将匹配所有 a
仅当存在 b
时才在字符串中在它之后。 ab
匹配,但是ac
或aa
不要。
(?=,|$)
是一个正向前瞻,包含 ,|$
表示逗号或字符串结尾。
(?<!\d)(\d)(?=,|$)
因此匹配任何数字,只要它前面没有数字并且后面有逗号,或者该数字位于字符串末尾。
关于python - 使用替换的正则表达式来转换数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19151690/