【问题标题】:Regular Expression to find brackets in a string正则表达式在字符串中查找括号
【发布时间】:2015-08-26 06:49:38
【问题描述】:

我有一个包含多个括号的字符串。让我们说

s="(a(vdwvndw){}]"

我想将所有括号提取为单独的字符串。

我试过这个:

>>> brackets=re.search(r"[(){}[]]+",s)
>>> brackets.group()

但它只给了我最后两个括号。

'}]'

这是为什么呢?它不应该获取字符集中的一个或多个括号吗?

【问题讨论】:

  • regex101.com 是构建和测试正则表达式的好工具。
  • 请注意,re.search 只会产生第一个匹配项。
  • 哦。当我找到所有时,它会给我一个匹配列表,然后我可以加入。搜索和匹配只给出第一个匹配是不是?它不会进一步检查其他匹配项吗?那为什么呢?我只使用了“+”,以便它可以检查一个或多个。
  • + 表示连续 1 个或多个匹配字符。如果匹配字符组之间有不匹配的字符,re.search 只查找第一个组,而re.match 只查找第一个组,然后只查找它在字符串开头的位置。

标签: python regex


【解决方案1】:

您必须转义第一个右方括号。

r'[(){}[\]]+'

要将它们全部组合成一个字符串,您可以搜索任何不匹配的内容并将其删除。

brackets = re.sub( r'[^(){}[\]]', '', s)

【讨论】:

    【解决方案2】:

    使用以下内容(右方括号必须在字符类转义):

    brackets=re.search(r"[(){}[\]]+",s)
                               ↑
    

    【讨论】:

    • 您好,感谢您的评论。但我无法理解为什么我需要转义最后一个方括号。字符类不应该搜索这些字符中的任何一个并且 + 会使其成为一个或多个吗?
    • @user 你是对的.. 但是正则表达式如何知道哪个方括号是结束方括号?内一个?还是外部的?..这就是为什么你需要逃避内部..希望你明白我的意思..
    • 是的。但是为什么搜索只获取一个匹配项?我正在使用“+”,所以它不应该获取一个或多个吗?
    • @user + 表示一个或多个指定模式。所以正则表达式 [(){}[\]]+ 将匹配 {{]({]{)} 等。但只有第一次出现返回匹配项.. 获取所有匹配项.. 你必须使用 re.findAll
    【解决方案3】:

    正则表达式"[(){}[]]+"(或者更确切地说是"[](){}[]+""[(){}[\]]+"(正如其他人建议的那样))查找一系列连续字符。 您需要做的是找到所有这些序列并加入它们。

    一个解决方案是这样的:

    brackets = ''.join(re.findall(r"[](){}[]+",s))
    

    还请注意,我重新排列了类中字符的顺序,因为 ] 必须位于类的开头,这样它就不会被解释为类定义的结尾。

    【讨论】:

    • re.sub^ 怎么样,即brackets = re.sub(r'[^](){}[]', '', s)
    • +1 是实际产生所需输出的第一个答案:P(并避免使用反斜杠)。
    【解决方案4】:

    你也可以不使用正则表达式:

    s="(a(vdwvndw){}]"
    keep = {"(",")","[","]","{","}"}
    print("".join([ch for ch in s if ch in keep]))
    ((){}]
    

    【讨论】:

    • 或者,因为这在我看来就像 Python 3,print(*(ch for ch in s if ch in keep), sep='')
    • @TigerhawkT3,是的,是的,但我认为 OP 想要使用该字符串,所以实际上它会被分配给一个变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多