使用re.sub()替换字符串的某些部分

时间:2017-02-04 09:49:06

标签: python regex python-2.7 replace

背景

我正在尝试使用re替换字符串中的某些值。基本上,用 1 替换首次检测到的(以特定模式)。

示例:

{1}        -> {1}
{2}        -> {1}
{3,}       -> {1,}
{3,16}     -> {1,16}
ab{3,16}   -> ab{1,16}
5a4b{3,16} -> 5a4b{1,16}
{1,4}      -> {1,4}

尝试

import re

pattern = '.*{(\d+)}|{(\d+),}|{(\d+),\d+}'
string = 'ab{3,16}'
print re.sub(pattern, '1', string)

但我得ab1而不是ab{1,16}

3 个答案:

答案 0 :(得分:2)

您不想替换{},,因此您可以使用positive lookaheads and lookbehinds来确保int为:

    {之后
  • (?<={)
  • },之前:(?=}|,)

如果您只想替换整个字符串中的第一个出现,可以将sub的第4个参数设置为1.在这种情况下,{3}{3}将转换为{{1 }}。更新:你不想要它。 :)

{1}{3}

以下是一些测试:

import re

pattern = '(?<={)\d+(?=}|,)'
string = 'ab{3,16}'
print re.sub(pattern, '1', string)

答案 1 :(得分:2)

当使用正则表达式替换时,将替换整个匹配的字符串。当您匹配整个import re def replace_first_int(string): pattern = '(?<={)\d+(?=}|,)' return re.sub(pattern, '1', string) print replace_first_int('{1}') # {1} print replace_first_int('{2}') # {1} print replace_first_int('{3,}') # {1,} print replace_first_int('{3') # {3 print replace_first_int('{3,16}') # {1,16} print replace_first_int('{1,4}') # {1,4} print replace_first_int('{3}{3}') # {1}{1} print replace_first_int('ab5') # ab5 print replace_first_int('5a4b{3,16}') # 5a4b{1,16} 时,它会相应地替换为{1,16}

对于您的样本1将作为模式使用,然后可以替换为(?<=\{)\d+,例如

1

答案 2 :(得分:0)

如果您的模式始终采用指定的格式(如示例所示),这就足够了:

print re.sub(r'{\d+', '{1', string, count=1)