簡體   English   中英

提取括號之間的字符串內容->例如:function_name((param1),(param2))應該給出(param1),(param2)

[英]extract string content between parenthesis -> for eg: function_name((param1),(param2)) should give (param1),(param2)

我想獲得功能fun5內的整個字符串。 例如:

1.) fun5(hello union fun1(param1) union fun2(param2)) union fun3(param3) union fun4(param4)

應該返回-> hello union fun1(param1) union fun2(param2)

2.) fun3(param3) union fun4(param4) union fun5(hello union fun1(param1) union fun2(param2))

應該返回-> hello union fun1(param1) union fun2(param2)

我嘗試使用以下正則表達式:

import re
str = "fun5(hello union fun1(param1) union fun2(param2)) union fun3(param3) union fun4(param4)"

if re.search(r'(:?\W|^)(:?fun5)\(', str, re.IGNORECASE):
    exp = re.search(fun5\((.*?)\)', str, re.IGNORECASE).group(1)
    print(exp)

但是由於內部嵌套了括號,因此無法正常工作。

如果您知道括號不會比某個有限數(示例中為2)深,則編寫正則表達式是可能的,但很棘手。 這是因為正則表達式根本不是為處理嵌套模式而設計的。 某些正則表達式引擎具有擴展功能,以允許模式的任意嵌套,或專門用於匹配嵌套括號中的文本,但Python不允許。

因此,如果您可能需要處理任意嵌套深度,則可以改用非正則表達式解決方案,例如下面的解決方案。 在這里,我們找到第一個開括號,然后逐個字符掃描。 每次找到一個開括號,我們都會增加深度。 每次找到一個右括號,我們都會減小深度並檢查是否在級別0。如果是,我們會找到一個與左括號匹配的右括號,然后返回結果。

def deparen(text):
    start = text.find("(")
    if start < 0:
        raise ValueError("no opening parenthesis")
    depth = 0
    for i in range(start, len(text)):
        if text[i] == "(":
            depth += 1
        elif text[i] == ")":
            depth -= 1
            if not depth:
                return text[start+1:i]
    raise ValueError("too few closing parentheses")

請注意,這不處理帶引號的括號。 例如,如果文本中可能包含帶引號的字符串,則這些字符串可能包含左括號和/或右括號,這不應計入嵌套中。 處理此問題的關鍵是檢測引號字符並跳過引號內的所有字符。 但是引號可能會被轉義,因此您也必須檢測到這一點……在某些時候,使用實際的解析器會變得更加容易。

怎么樣.*fun5\\((.*\\(.*\\))\\)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM