我正在尝试将文字字符串从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.
答案 0 :(得分:6)
你可以试试这个:
>>> 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_]+
,假设文件名仅包含训练数字以外的字母和下划线。如果需要,请选择更合适的表达方式。
答案 1 :(得分:1)
要匹配末尾单个数字的文件,请使用单词边界\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'
答案 2 :(得分:1)
还可以在检查文件是否存在两位数时使用\ D | $,从而确定是否将文件替换为file0
以下代码也将有助于达到要求。
重新导入
text ='file1 file2 file3 file4 file11 file22 file33 file1'
x = re.sub(r'file([0-9](\ D | $))',r'file0 \ 1',text)
print(x)
答案 3 :(得分:0)
您可以使用组捕获您希望保留的部分,然后在替换文本中使用这些组。
x = re.sub(r'file([1-9])',r'file0\1',text)
通过在正则表达式搜索中包含( )
来创建匹配组。在这种情况下,您可以将其与\group
或\1
一起使用,因为我们希望插入第一个组。
答案 4 :(得分:0)
我相信以下内容会对您有所帮助。这是有益的,它只会在“文件”之后插入一个'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'。试试吧!