【问题标题】:Get the string within brackets in Python在Python中获取括号内的字符串
【发布时间】:2012-01-24 01:08:53
【问题描述】:

我有一个示例字符串<alpha.Customer[cus_Y4o9qMEZAugtnW] active_card=<alpha.AlphaObject[card] ...>, created=1324336085, description='Customer for My Test App', livemode=False>

我只想要值 cus_Y4o9qMEZAugtnW 而不是 card(在另一个 [] 中)

如何在 Python 中以最简单的方式做到这一点? 也许通过使用 RegEx(我不擅长)?

【问题讨论】:

    标签: python regex brackets


    【解决方案1】:

    您可以使用str.split 来执行此操作。

    s = "<alpha.Customer[cus_Y4o9qMEZAugtnW] active_card=<alpha.AlphaObject[card]\
     ...>, created=1324336085, description='Customer for My Test App',\
     livemode=False>"
    val = s.split('[', 1)[1].split(']')[0]
    

    那么我们有:

    >>> val
    'cus_Y4o9qMEZAugtnW'
    

    【讨论】:

    • 是的,这取决于字符串的混乱程度,但拆分也可以在这里工作..
    • 虽然影响不大,但两者中使用 regex/split 的效率更高。你能否解释一下你的分裂部分。谢谢。
    • @user993563 查看示例答案中指向str.split 的链接。简而言之,解决方案中的第一个 split 返回一个长度为 2 的列表;第一个元素是第一个[ 之前的子字符串,第二个是] 之后的子字符串。至于性能,您应该对其进行测量以找出答案(查看timeit)。如果您计划在一次程序运行中多次提取值并决定使用正则表达式,您可能需要compile 正则表达式。
    • @user993563 请注意,您对“python 中最简单的方法”的要求可能与性能考虑不一致。我选择使用split,因为我觉得这反映了您对“最简单”的要求。
    【解决方案2】:

    怎么样:

    import re
    
    s = "alpha.Customer[cus_Y4o9qMEZAugtnW] ..."
    m = re.search(r"\[([A-Za-z0-9_]+)\]", s)
    print m.group(1)
    

    对我来说这是打印出来的:

    cus_Y4o9qMEZAugtnW
    

    请注意,对re.search(...) 的调用会找到与正则表达式的第一个匹配项,因此除非您再次重复搜索,否则它不会找到[card]

    编辑:这里的regular expression是一个pythonraw string literal,这基本上意味着反斜杠不被视为特殊字符并被传递给re.search()方法不变。正则表达式的parts为:

    1. \[ 匹配文字 [ 字符
    2. ( 开始一个新组
    3. [A-Za-z0-9_] 是匹配任何字母(大写或小写)、数字或下划线的字符集
    4. + 匹配前面的元素(字符集)一次或多次。
    5. )结束群
    6. \] 匹配文字 ] 字符

    编辑:正如 D K 所指出的,正则表达式可以简化为:

    m = re.search(r"\[(\w+)\]", s)
    

    因为\w 是一个特殊序列,它与[a-zA-Z0-9_] 的含义相同,具体取决于re.LOCALEre.UNICODE 设置。

    【讨论】:

    • 能否请您解释一下您对正则表达式部分的回答,这样我就不必再询问类似类型的问题了。谢谢。
    • 我已经用正则表达式的解释和 python 正则表达式文档的链接编辑了我的答案。
    • 为什么不用\w替换[A-Za-z0-9_]
    • 是的,您可以将[A-Za-z0-9_] 替换为\w
    • @user3015703 在字符集中,您不需要转义特殊字符,“-”或“]”除外。要包含破折号,您可以在它前面加上一个斜杠,或者使它成为集合中的第一个或最后一个字符。所以使用 '[A-Za-z0-9_+-]' 应该可以。见Python regular expression syntax documentation
    【解决方案3】:

    这应该可以完成工作:

    re.match(r"[^[]*\[([^]]*)\]", yourstring).groups()[0]
    

    【讨论】:

    • 我想这超出了 OP 所需的范围,因为他的案例只需要字母数字,但这对我有用。谢谢!
    • 这会很慢,因为我们正在检查大量的东西。因此我宁愿建议使用“[(.*?)]”,如果括号没有正确显示在下面,请按照我的回答。
    【解决方案4】:

    你也可以使用

    re.findall(r"\[([A-Za-z0-9_]+)\]", string)
    

    如果您想查找多个匹配项。

    另请参阅以获取更多信息: How can I find all matches to a regular expression in Python?

    【讨论】:

      【解决方案5】:
      your_string = "lnfgbdgfi343456dsfidf[my data] ljfbgns47647jfbgfjbgskj"
      your_string[your_string.find("[")+1 : your_string.find("]")]
      

      礼貌:Regular expression to return text between parenthesis

      【讨论】:

      • 只有在没有其他括号的情况下才有效。
      • @АлександрЗахаров 是的。我们只能将这种方法用于简单的情况。
      【解决方案6】:

      你可以使用

      import re
      
      s = re.search(r"\[.*?]", string)
      if s:
          print(s.group(0))
      

      【讨论】:

        【解决方案7】:

        这个怎么样?使用文件说明的示例:

        f = open('abc.log','r')
        content = f.readlines()
        for line in content:
            m = re.search(r"\[(.*?)\]", line)
            print m.group(1)
            
        

        希望这会有所帮助:

        Magic regex : \[(.*?)\]
        

        解释:

        \[ : [ 是一个元字符,如果你想从字面上匹配,需要转义。

        (.*?) :以非贪婪的方式匹配所有内容并捕获它。

        \] : ] 是一个元字符,如果你想从字面上匹配,需要转义。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-12-24
          • 2012-06-30
          • 2011-12-23
          • 2022-11-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-04
          相关资源
          最近更新 更多