我正在尝试将文本字符串从 更改file1
为file01
。我对python真的很陌生,在尝试使用模式时无法弄清楚'repl'位置应该去什么。谁能帮我一把?
text = 'file1 file2 file3'
x = re.sub(r'file[1-9]',r'file\0\w',text) #I'm not sure what should go in repl.
我正在尝试将文本字符串从 更改file1
为file01
。我对python真的很陌生,在尝试使用模式时无法弄清楚'repl'位置应该去什么。谁能帮我一把?
text = 'file1 file2 file3'
x = re.sub(r'file[1-9]',r'file\0\w',text) #I'm not sure what should go in repl.
你可以试试这个:
>>> import re
>>> text = 'file1 file2 file3'
>>> x = re.sub(r'file([1-9])',r'file0\1',text)
'file01 file02 file03'
包裹在括号中的括号[1-9]
捕获了匹配项,这是第一个匹配项。你会看到我在替换中使用了它,\1
意思是比赛中的第一个接球。
此外,如果您不想为 2 位或更多位的文件添加零,您可以[^\d]
在正则表达式中添加:
x = re.sub(r'file([1-9](\s|$))',r'file0\1',text)
现在我正在使用str.format()
和lambda
表达式重新访问此答案,因此提供了更多通用解决方案:
import re
fmt = '{:03d}' # Let's say we want 3 digits with leading zeroes
s = 'file1 file2 file3 text40'
result = re.sub(r"([A-Za-z_]+)([0-9]+)", \
lambda x: x.group(1) + fmt.format(int(x.group(2))), \
s)
print(result)
# 'file001 file002 file003 text040'
关于 lambda 表达式的一些细节:
lambda x: x.group(1) + fmt.format(int(x.group(2)))
# ^--------^ ^-^ ^-------------^
# filename format file number ([0-9]+) converted to int
# ([A-Za-z_]+) so format() can work with our format
我使用的表达式[A-Za-z_]+
假设文件名仅包含训练数字之外的字母和下划线。如果需要,请选择更合适的表达方式。
要匹配末尾有单个数字的文件,请使用单词边界\b
:
>>> text = ' '.join('file{}'.format(i) for i in range(12))
>>> text
'file0 file1 file2 file3 file4 file5 file6 file7 file8 file9 file10 file11'
>>> import re
>>> re.sub(r'file(\d)\b',r'file0\1',text)
'file00 file01 file02 file03 file04 file05 file06 file07 file08 file09 file10 file11'
也可以在检查文件是否存在两位数时使用 \D|$,它决定是否将文件替换为 file0
以下代码也将有助于实现所需。
重新进口
文本 = '文件 1 文件 2 文件 3 文件 4 文件 11 文件 22 文件 33 文件 1'
x = re.sub(r'file([0-9] (\D|$))',r'file0\1',text)
打印(x)
您可以使用组来捕获您希望保留的部分,然后在替换文本中使用这些组。
x = re.sub(r'file([1-9])',r'file0\1',text)
通过包含( )
在正则表达式搜索中来创建匹配组。然后您可以将它与\group
, 或\1
在这种情况下因为我们希望插入第一组一起使用。
我相信以下内容会对您有所帮助。这样做的好处是它只会在 'file' 后面有一个数字的地方插入一个 '0'(通过边界 ['\b'] 特殊字符包含):
text = 'file1 file2 file3'
findallfile = re.findall(r'file\d\b', text)
for instance in findallfile:
textwithzeros = re.sub('file', 'file0', text)
'textwithzeros' 现在应该是新版本的 'text' 字符串,每个数字前都带有 '0'。试试看!