替换字符串Python的某些部分
我似乎无法解决这个问题。我有很多不同的弦,它们总是不同的。虽然我需要更换它们的末端,但它们的长度总是不同的。以下是一对字符串的示例:替换字符串Python的某些部分,python,string,Python,String,我似乎无法解决这个问题。我有很多不同的弦,它们总是不同的。虽然我需要更换它们的末端,但它们的长度总是不同的。以下是一对字符串的示例: string1 = "thisisnumber1(111)" string2 = "itsraining(22252)" string3 = "fluffydog(3)" 现在,当我打印这些内容时,它当然会打印以下内容: thisisnumber1(111) itsraining(22252) fluffydog(3) 但我希望打印的内容如下: thisisn
string1 = "thisisnumber1(111)"
string2 = "itsraining(22252)"
string3 = "fluffydog(3)"
现在,当我打印这些内容时,它当然会打印以下内容:
thisisnumber1(111)
itsraining(22252)
fluffydog(3)
但我希望打印的内容如下:
thisisnumber1
itsraining
fluffydog
我希望它删除每个字符串括号中的部分,但我不知道长度总是在变化有什么意义。谢谢您您可以使用:
>>> 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
(第一个元素)处的元素。这将是每个字符串末尾(…)
之前的所有内容。您可以使用:
>>> 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
处的元素(第一个元素)。这将是之前的所有内容(…)
在每个字符串的末尾。因为您在注释中说:
“括号中的所有内容都是数字”
因此,您的参数之间总是有数字,我建议您使用正则表达式模块来删除它们:
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
既然你在评论中说: “括号中的所有内容都是数字” 因此,您的参数之间总是有数字,我建议您使用正则表达式模块来删除它们:
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
你的另一个选择是使用正则表达式,这可以让你更精确地控制你想要得到什么
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++\)”
是正则表达式,是您试图查找的字符串的公式
+
表示匹配除换行符以外的任何类型的一个或多个字符
\d+
表示匹配一个或多个数字
\(
和\)
是“(”和“)”字符
将+
放在括号中会将该字符串序列放在一个组中,这意味着您希望以后能够访问该组字符。我们不会将序列\(\d+\)
放在一个组中,因为我们不关心这些字符
regex.match(regex,string1).groups()
给出string1
中属于组的每个子字符串。由于您只需要1个子字符串,因此只需访问第0个元素
如果您想了解更多信息,在教程的要点上有一个很好的正则表达式教程。您的另一个选择是使用正则表达式,它可以让您更精确地控制想要得到的内容
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++\)”
是正则表达式,是您试图查找的字符串的公式
+
表示匹配除换行符以外的任何类型的一个或多个字符
\d+
表示匹配一个或多个数字
\(
和\)
是“(”和“)”字符
将+
放在括号中会将该字符串序列放在一个组中,这意味着您希望以后能够访问该组字符。我们不会将序列\(\d+\)
放在一个组中,因为我们不关心这些字符
regex.match(regex,string1).groups()
给出string1
中属于组的每个子字符串。由于您只需要1个子字符串,因此只需访问第0个元素
如果你想了解更多,在教程的要点上有一个很好的正则表达式教程。你需要担心吗,例如,
“thishasparens(butnotanumber)”
或“thishasparens(10)”或“thishasparens(10)(20)”
或“thishasparens(123)thenmore(456)”
或其他类似的东西?如果是这样,你想为每种情况做什么?不,括号中的都是数字:)你需要担心吗,例如,“thishasparens(但不是数字)”
或“thishasparens”(10“
或“thishasparens(10)(20)”
或“thishasparens(123)”等等(456)“
或其他类似的内容?如果是这样,您想为每种情况做些什么?不,括号中的所有内容都是数字:)为了确保操作只在字符串的末尾进行,您可能希望将操作限制为单个拆分以处理字符串,例如“flu(ffy)dog(3)”
,例如rsplit(“flu(ffy)dog(3)”,1)
@mhawke:另一方面,你怎么知道在这种情况下,流感(ffy)狗
将是理想的输出,而不是流感狗
或流感
?(这就是为什么我问OP的原因,他确认他的数据中不存在这些病例,这意味着这个答案是足够的。)@abarnert:现在回想起来,是的。OP没有声明替换字符串的结尾,我的建议将其限制为该状态,而不假设数据不包含任何额外的左括号。为了确保操作仅在字符串的结尾,您可能希望限制为单次拆分来处理字符串,如“flu(ffy)dog(3)”
,例如rsplit(“flu(ffy)dog(3)”,1)
@mhawke:另一方面,你怎么知道flu(ffy)dog
在这种情况下是理想的输出,而不是fludog
或flu
?(这就是我问OP的原因,OP确认他的数据中不存在这些情况,这意味着这个答案是足够的。)@abarnert:回想起来,是的。OP确实声明替换字符串的结尾,我的建议将其限制在这一点,而不假设数据不包含任何额外的左括号。