5

我正在尝试将文本字符串从 更改file1file01。我对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.
4

5 回答 5

9

你可以试试这个:

>>> 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_]+假设文件名仅包含训练数字之外的字母和下划线。如果需要,请选择更合适的表达方式。

于 2013-05-23T06:49:00.283 回答
2

要匹配末尾有单个数字的文件,请使用单词边界\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'
于 2013-05-23T13:24:11.290 回答
1

也可以在检查文件是否存在两位数时使用 \D|$,它决定是否将文件替换为 file0

以下代码也将有助于实现所需。

重新进口

文本 = '文件 1 文件 2 文件 3 文件 4 文件 11 文件 22 文件 33 文件 1'

x = re.sub(r'file([0-9] (\D|$))',r'file0\1',text)

打印(x)

于 2018-07-27T02:57:34.693 回答
0

您可以使用组来捕获您希望保留的部分,然后在替换文本中使用这些组。

 x = re.sub(r'file([1-9])',r'file0\1',text)

通过包含( )在正则表达式搜索中来创建匹配组。然后您可以将它与\group, 或\1在这种情况下因为我们希望插入第一组一起使用。

于 2013-05-23T06:52:17.747 回答
0

我相信以下内容会对您有所帮助。这样做的好处是它只会在 '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'。试试看!

于 2014-03-22T20:24:43.630 回答