【问题标题】:Replacing Certain Parts of a String Python替换字符串 Python 的某些部分
【发布时间】:2014-10-14 00:39:31
【问题描述】:

我似乎无法解决这个问题。我有许多不同的字符串,而且它们总是不同的。我需要更换它们的末端,但它们的长度总是不同的。这是几个字符串的示例:

string1 = "thisisnumber1(111)"
string2 = "itsraining(22252)"
string3 = "fluffydog(3)"

现在,当我打印这些内容时,它当然会打印以下内容:

thisisnumber1(111)
itsraining(22252)
fluffydog(3)

我希望它打印的内容如下:

thisisnumber1
itsraining
fluffydog

我希望它删除每个字符串的括号中的部分,但我不知道长度总是在变化有多大意义。谢谢你

【问题讨论】:

  • 您是否需要担心,例如"thishasparens(butnotanumber)""thishasunclosedparens(10""thishastwosets(10)(20)""thishasparens(123)thenmore(456)" 或其他类似的东西?如果是这样,您想针对每种情况采取什么措施?
  • 不,括号里的都是数字:)

标签: python string


【解决方案1】:

您可以为此使用str.rsplit

>>> string1 = "thisisnumber1(111)"
>>> string2 = "itsraining(22252)"
>>> string3 = "fluffydog(3)"
>>>
>>> string1.rsplit("(")
['thisisnumber1', '111)']
>>> string1.rsplit("(")[0]
'thisisnumber1'
>>>
>>> string2.rsplit("(")
['itsraining', '22252)']
>>> string2.rsplit("(")[0]
'itsraining'
>>>
>>> string3.rsplit("(")
['fluffydog', '3)']
>>> string3.rsplit("(")[0]
'fluffydog'
>>>

str.rsplit 将字符串从右到左拆分,而不是像 str.split 那样从左到右拆分。因此,我们在( 上从右到左拆分字符串,然后检索索引0 处的元素(第一个元素)。这将是每个字符串末尾 (...) 之前的所有内容。

【讨论】:

  • 为了确保操作仅在字符串的末尾,您可能希望限制为单个拆分来处理像"flu(ffy)dog(3)" 这样的字符串,例如rsplit("flu(ffy)dog(3)", 1).
  • @mhawke:另一方面,你怎么知道flu(ffy)dog 将是这种情况下所需的输出,而不是fludogflu? (这就是为什么我问了 OP,他确认他的数据中不存在这些案例,这意味着这个答案就足够了。)
  • @abarnert :回想起来,是的。 OP 确实声明替换了字符串的末尾,我的建议将其限制在此范围内,而不假设数据不包含任何额外的左括号。
【解决方案2】:

您的另一个选择是使用正则表达式,它可以让您更精确地控制想要获得的内容。

import re
regex = regex = r"(.+)\(\d+\)"

print re.match(regex, string1).groups()[0] #returns thisisnumber1
print re.match(regex, string2).groups()[0] #returns itsraining
print re.match(regex, string3).groups()[0] #returns fluffydog

正在发生的事情的细分:

regex = r"(.+)\(\d+\)" 是正则表达式,是您要查找的字符串的公式

.+ 表示匹配除换行符以外的任何类型的 1 个或多个字符

\d+ 表示匹配 1 个或多个数字

\(\) 是“(”和“)”字符

.+ 放在括号中会将字符串序列放在一个组中,这意味着该组字符是您希望以后能够访问的字符组。我们不会将序列\(\d+\) 放在一个组中,因为我们不关心这些字符。

regex.match(regex, string1).groups() 给出string1 中属于组的每个子字符串。由于您只需要 1 个子字符串,因此您只需访问第 0 个元素。

如果您想了解更多信息,请在 Tutorial's Point here 上有一个关于正则表达式的精彩教程。

【讨论】:

    【解决方案3】:

    既然你在评论中说:

    “括号里的都是数字”

    所以你的括号之间总是有数字,我建议你看看用正则表达式模块删除它们:

    import re
    
    string1 = "thisisnumber1(111)"
    string2 = "itsraining(22252)"
    string3 = "fluffydog(3)"
    
    strings = string1, string2, string3
    
    for s in strings:
        s_replaced = re.sub(
            r'''
            \( # must escape the parens, since these are special characters in regex
            \d+ # one or more digits, 0-9
            \)
            ''', # this regular expression will be replaced by the next argument
            '', replace the above with an empty string
            s, # the string we're modifying
            re.VERBOSE) # verbose flag allows us to comment regex clearly
        print(s_replaced)
    

    打印:

    thisisnumber1
    itsraining
    fluffydog
    

    【讨论】:

      猜你喜欢
      • 2018-07-14
      • 2011-12-31
      • 2018-04-08
      • 1970-01-01
      • 2017-08-30
      • 2017-08-30
      • 2013-12-20
      • 2014-03-27
      • 1970-01-01
      相关资源
      最近更新 更多