【问题标题】:python pattern detect and replace stringpython模式检测和替换字符串
【发布时间】:2021-08-13 12:38:26
【问题描述】:

我有一个关于Python字符串操作的问题:

这是一个字符串,其中有多个 .(dot),

喜欢: "a3a.b1b2b.cccc.ded.f.g"

问题是找到最后一个.(dot)之前的内容,即 "a3a.b1b2b.cccc.ded.f" 在这个例子中(我们称之为 STRING_BEFORE_LAST_DOT)

我们需要将 STRING_BEFORE_LAST_DOT 替换为 STRING_BEFORE_LAST_DOT + "_Approved"。 所以结果应该是: "a3a.b1b2b.cccc.ded.f_Approved.g".

还有一些例子:

"a.b" -> "a_Approved.b"
"first.second.c" -> "first.second_Approved.c"

我可以定义一个函数来做到这一点,我想知道是否有任何先进的方法,比如使用 .replace() 来实现它。谢谢。

【问题讨论】:

  • 除了一些花哨的正则表达式之外,您还可以使用splitjoin 轻松完成此操作。到目前为止,您自己尝试过什么吗?
  • @Ma0 是的,我尝试定义一个函数(按点拆分并重新连接各个部分)。我知道它离一个有效的解决方案还很远,所以来寻求帮助..
  • 其实应该不会太糟糕。性能对您的应用程序如此重要吗?

标签: python string replace


【解决方案1】:

您可以使用join + rsplit,限制为 1:

>>> "_Approved.".join("a.b".rsplit(".",1))
'a_Approved.b'
>>> "_Approved.".join("first.second.c".rsplit(".",1))
'first.second_Approved.c'

【讨论】:

    【解决方案2】:
    # your String
    string = 'a3a.b1b2b.cccc.ded.f.g'
    # find the last dot character in your string
    StringIndex = string.rfind('.')
    # create a temporary list of your string and swap the last dot with your preferred string (_Approved.)
    temp = list(string)
    temp[StringIndex] = '_Approved.'
    # replace
    string = ''.join(temp)
    # print
    print('Old String: a3a.b1b2b.cccc.ded.f.g \nNew String: '+ string)
    
    # OUTPUT
    # Old String: a3a.b1b2b.cccc.ded.f.g 
    # New String: a3a.b1b2b.cccc.ded.f_Approved.g
    

    【讨论】:

      【解决方案3】:

      这是一个您可以尝试的解决方案,

      def _replace(input_):
          sub_ = input_[input_.rfind("."):]
          return input_.replace(sub_, f"_Approved{sub_}")
      
      
      print(_replace("a.b"))
      print(_replace("first.second.c"))
      

      a_Approved.b
      first.second_Approved.c
      

      【讨论】:

        【解决方案4】:

        如何使用正则表达式的示例:

        import re
        s = "a3a.b1b2b.cccc.ded.f.g" 
        no_ext = re.split(r'\.[^\.]*$', s)[0]
        

        【讨论】:

          【解决方案5】:

          这是另一种选择。您可以使用以下命令访问每个点的索引:

          import re
          str = "a3a.b1b2b.cccc.ded.f"
          # Finds every dot's starting index. (For ending of matched value d.end())
          dots = [d.start(0) for d in re.finditer(r'\.+', str)]
          # _Approved added
          str = str[:dots[-1]] + "_Approved" + str[dots[-1]:]
          

          【讨论】:

            【解决方案6】:

            您可以使用模式匹配从最后一个点到字符串结尾.[^.]*$

            然后替换为 _Approved 并在其后使用 \g<0> 添加完整匹配

            print(re.sub(r"\.[^.]*$", r"_Approved\g<0>", "a3a.b1b2b.cccc.ded.f.g"))
            

            输出

            a3a.b1b2b.cccc.ded.f_Approved.g
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-09-19
              • 1970-01-01
              • 2020-11-22
              • 1970-01-01
              • 2021-05-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多