在python中,如何使用正则表达式将方括号替换为圆括号

在python中,如何使用正则表达式将方括号替换为圆括号,python,regex,Python,Regex,我有一个列表:list=[1,2,3]。我想把它转换成一个带括号的字符串:string=(1,2,3) 目前我正在使用string replacestring=str(list).replace('[','(').replace(']','))。但是我认为使用regex.sub有一个更好的方法。但是我不知道怎么做。非常感谢您可以使用string.maketrans来代替它--我打赌它比str.replace序列运行得更快,而且它可以更好地扩展到更多的单字符替换 >>> impo

我有一个列表:
list=[1,2,3]
。我想把它转换成一个带括号的字符串:
string=(1,2,3)


目前我正在使用string replace
string=str(list).replace('[','(').replace(']','))
。但是我认为使用regex.sub有一个更好的方法。但是我不知道怎么做。非常感谢

您可以使用
string.maketrans
来代替它--我打赌它比
str.replace
序列运行得更快,而且它可以更好地扩展到更多的单字符替换

>>> import string
>>> table = string.maketrans('[]','()')
>>> s = "[1, 2, 3, 4]"
>>> s.translate(table)
'(1, 2, 3, 4)'
您甚至可以通过将可选的第二个参数传递给
str.translate
,从原始字符串中删除字符:

>>> s = str(['1','2'])
>>> s
"['1', '2']"
>>> s.translate(table,"'")
'(1, 2)'
在python3.x中,字符串模块消失了,您可以通过
str
内置程序访问
maketrans

table = str.maketrans('[]','()')

如果您确实有一份清单,那么:

>>> s  = [1,2,3]
>>> str(tuple(s))
'(1, 2, 3)'
试试这个:

'({0})'.format(', '.join(str(x) for x in list))
顺便说一下,给自己的变量命名不是一个好主意,因为它与内置函数冲突。而且
string
可能与同名模块冲突。

str([1,2,3]).replace(“[”,“(”).replace(“]”,“)”)

应该很适合你,据我所知,它前后兼容

就可重用性而言,您可以对多种不同类型的字符串使用以下函数来更改它们的开头和结尾:

def change(str_obj,start,end):
    if isinstance(str_obj,str) and isinstance(start,str) and isinstance(end,str):
        pass
    else:
        raise Exception("Error, expecting a 'str' objects, got %s." % ",".join(str(type(x)) for x in [str_obj,start,end]))
    if len(str_obj)>=2:
        temp=list(str_obj)
        temp[0]=start
        temp[len(str_obj)-1]=end
        return "".join(temp)
    else:
         raise Exception("Error, string size must be greater than or equal to 2. Got a length of: %s" % len(str_obj))

如果你真的想用正则表达式,我想这会管用的。但其他发布的解决方案可能更高效和/或更易于使用

import re

string = str(list)
re.sub(r"[\[]", "(", string)
re.sub(r"[\]]", ")", string)
@像这样的事你是说

def replace_stuff(string):
    string_list = list(string)
    pattern = re.compile(r"[\[\]]")
    result = re.match(pattern, string)
    for i in range(len(result.groups())):
        bracket = result.group(i)
        index = bracket.start()
        print(index)
        if bracket == "[":
            string_list[index] = "("
        else:
            string_list[index] = ")"

    return str(string_list)

它不太有效,因为某些原因,len(result.groups())始终为0,即使正则表达式应该找到匹配项。所以无法测试这是否更快,但因为我无法让它工作,所以无法测试它。我现在得去睡觉了,如果有人能解决这个问题,那就去吧。

有十亿种方法可以解决这个问题,所有的答案都证明了这一点。这里还有一个:

my_list = [1,2,3]
my_str = "(%s)" % str(my_list).strip('[]')
或使其可回收利用:

list_in_parens = lambda l: "(%s)" % str(l).strip('[]')
my_str = list_in_parens(my_list)
您所需要的只是:

"(" + strng.strip('[]') + ")"
它适用于单元素列表和多元素列表

>>> lst = [1,2,3]
>>> strng = str(lst)
>>> "(" + strng.strip('[]') + ")"
'(1, 2, 3)'


>>> lst = [1]
>>> strng = str(lst)
>>> "(" + strng.strip('[]') + ")"
'(1)'

不,我觉得你做的很好。str.replace(旧的,新的[,max])应该仔细阅读。我只是假设OP有一个格式类似于列表的字符串+1.我想这是我在真实代码中的做法。但是我有另一个带有字符串的代码,那么它就不太好用了。>>s=['1']>>>str(元组))“('1',)”
str(元组)).rstrip(',)+')”
'(1)”不适用于具有单个元素的列表。它将添加一个尾随逗号,如“(1,)”,但在字符串列表中效果不太好。>>s=['1']>>>str(s).translate(table)“('1')”@Winston——它实际上很容易处理这个问题。看我的编辑。是的,这很好用。但是我想要一个更好的实现。也许regex是个好方法,太好了。有可能在一行上完成吗?我根本不是正则表达式专家,但我不这么认为。因为您想用两个不同的字符串(“and”)替换,并且只能使用re.sub.@DaanLubbers将一个正则表达式替换为一个字符串——您可以定义一个传递给
re.sub
的函数,该函数将获取匹配对象并决定是替换
”(“
还是
”)
。它甚至可能更高效(你需要
timeit
才能找到),但它的代码会稍微多一些,因为你需要正确地定义函数等等。用一个函数更新了帖子,这个函数应该能满足你的要求(我想)。我不知道它是否会很快,因为我不知道re函数需要多长时间,但至少要花更多的精力来编写代码。我现在很好奇这是否更快。可悲的是,正如你所读到的,我不知道为什么它不能按原样工作,必须要走,也许你可以试试看?@Winston我猜你的python版本比2.7/3.1旧。编辑会为您修复它。