Python 3.3中的re.sub

时间:2013-05-23 06:34:03

标签: python regex python-3.x substitution

我正在尝试将文字字符串从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.

5 个答案:

答案 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'。试试吧!