【问题标题】:enumeration in regular expression正则表达式中的枚举
【发布时间】:2021-01-03 09:38:13
【问题描述】:

我有一个看起来像这样的字符串...

mystring = '{#var#}status has been updated{#var#}with remark{#var#}connect with{#var#}at{#var#}transactions may be{#var#}till{#var#}'

我只需要给它编号,让它看起来像这样......

{#var1#}status has been updated{#var2#}with remark{#var3#}connect with{#var4#}at{#var5#}transactions may be{#var6#}till{#var7#}

这会将字符串替换为数字 1

mystring.replace("{#var#}", "{#var1#}")

不知道如何枚举数字 2,3,4 到 7

【问题讨论】:

  • 你可以在循环中做一个简单的替换(count=1),每次迭代都改变替换字符串
  • 可能使用 f-string 或 .format?

标签: python string replace


【解决方案1】:
mystring = '{#var#}status has been updated{#var#}with remark{#var#}connect with{#var#}at{#var#}transactions may be{#var#}till{#var#}'


for i in range(mystring.count('#var#')):
    mystring = mystring.replace('#var#', f'#var{i + 1}#', 1)

print(mystring)

str.replace 接受第三个参数,它指定要替换的出现次数,所以这里设置为1。所以在每次迭代中,只有#var# 的第一次出现被替换为f'#var{i + 1}#',其中i0 开始一直到#var# 的初始出现次数。

【讨论】:

  • 请不要只给出代码答案,在解释您选择的方式时
  • 添加了简要说明
【解决方案2】:

输入 mystring = '{#var#}状态已更新{#var#}备注{#var#}连接{#var#}在{#var#}交易可能是{#var#}直到{#var# }'

步骤

1 - 首先将“{#var#}”替换为“{}”

mystring = mystring.replace('{#var#}', '{}')
# mystring become => '{}status has been updated{}with remark{}connect with{}at{}transactions may be{}till{}'

2 - 然后创建范围从 1 到 8 的 var_names

var_names = [ f'{{#var1#}}' for i in range(1, 8) ]

3 - 然后 .format 将变量放在字符串中

mystring = mystring.format(*var_names)

输出

'{#var1#}status has been updated{#var2#}with remark{#var3#}connect with{#var4#}at{#var5#}transactions may be{#var6#}till{#var7#}'

【讨论】:

    【解决方案3】:

    您可以尝试将iterstr.joinlist 理解一起使用:

    mystring = '{#var#}status has been updated{#var#}with remark{#var#}connect with{#var#}at{#var#}transactions may be{#var#}till{#var#}'
    it = iter(range(1, mystring.count('{#var#}') + 1))
    print(' '.join([v[:-1] + str(next(it)) + '}' if v == '{#var#}' else v for v in mystring.replace('{#var#}', ' {#var#} ').split()]))
    

    输出:

    {#var#1}status has been updated{#var#2}with remark{#var#3}connect with{#var#4}at{#var#5}transactions may be{#var#6}till{#var#7}
    

    【讨论】:

    • 为什么不是一个简单的范围?
    • @azro 编辑我的。
    • 您的答案过于复杂,使用循环更容易理解,现在不是了。可读性也应该是一个优先事项;)
    • @azro python_user 得到了 for 循环的答案,所以我尝试了其他方法。
    【解决方案4】:

    您也可以使用正则表达式。 finditer 可用于获取所有匹配为正则表达式对象,并可以构造所需的字符串

    mystring = '{#var#}status has been updated{#var#}with remark{#var#}connect with{#var#}at{#var#}transactions may be{#var#}till{#var#}'    
    
    output_string = ""
    last_match_end = 0
    for i_enm, match in enumerate(re.finditer(r'\{#var#\}', mystring)):
        output_string += mystring[last_match_end:match.start()] + "{#var" + str(i_enm+1) + "#}"
        last_match_end = match.end()
    output_string += mystring[last_match_end:]
    

    输出字符串:

    '{#var1#}status has been updated{#var2#}with remark{#var3#}connect with{#var4#}at{#var5#}transactions may be{#var6#}till{#var7#}'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-21
      • 2012-11-21
      • 2019-06-23
      • 2021-02-22
      • 1970-01-01
      • 2015-04-06
      • 2013-05-02
      相关资源
      最近更新 更多