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

时间:2013-02-19 02:58:59

标签: python regex

我有一个清单:list = [1,2,3]。我想将其转换为带括号的字符串:string = (1,2,3)

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

7 个答案:

答案 0 :(得分:12)

如果你确实有一个清单,那么:

>>> s  = [1,2,3]
>>> str(tuple(s))
'(1, 2, 3)'

答案 1 :(得分:3)

您可以使用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中,字符串模块消失了,您可以通过内置的maketrans访问str

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

答案 2 :(得分:1)

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))

答案 3 :(得分:1)

有十亿种方法可以做到这一点,所有答案都证明了这一点。这是另一个:

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)

答案 4 :(得分:0)

试试这个:

'({0})'.format(', '.join(str(x) for x in list))

顺便说一句,命名自己的变量list并不是一个好主意,因为它与内置函数冲突。 string也可能与同名模块发生冲突。

答案 5 :(得分:0)

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

import re

string = str(list)
re.sub(r"[\[]", "(", string)
re.sub(r"[\]]", ")", string)

@mgilson这是你的意思吗?

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,即使正则表达式应该找到匹配项,它也不能正常工作。所以无法测试这是否更快,但因为我无法让它工作我无法测试它。我现在必须上床睡觉,所以如果有人可以解决这个问题,请继续。

答案 6 :(得分:0)

您需要的是:

"(" + strng.strip('[]') + ")"

它适用于单元素和多元素列表。

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


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