Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
替换字符串Python的某些部分_Python_String - Fatal编程技术网

替换字符串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确实声明替换字符串的结尾,我的建议将其限制在这一点,而不假设数据不包含任何额外的左括号。