python正则表达式搜索直到括号匹配

python正则表达式搜索直到括号匹配,python,regex,Python,Regex,我需要从如下字符串中提取一些数据(VHDL代码): VHDL注释的大小不尽相同,为了便于阅读,我截断了它们 我有兴趣了解“端口(”和最后一个“);”之间的所有内容(关闭端口声明的一个)。当然,VHDL声明可能不像这里那样缩进和格式良好 我有一个Python 2.7.x正则表达式: pattern = re.compile("port\s*\((.*?)\s+\)\s*;") match3 = pattern.search(entBody) ports = match3.group(1) 如果关

我需要从如下字符串中提取一些数据(VHDL代码):

VHDL注释的大小不尽相同,为了便于阅读,我截断了它们

我有兴趣了解“端口(”和最后一个“);”之间的所有内容(关闭端口声明的一个)。当然,VHDL声明可能不像这里那样缩进和格式良好

我有一个Python 2.7.x正则表达式:

pattern = re.compile("port\s*\((.*?)\s+\)\s*;")
match3 = pattern.search(entBody)
ports = match3.group(1)
如果关闭按钮可以正常工作);不是在最后一次申报后立即提交的。以下操作将不起作用:

entBody2 = """entity QSPI_FLASH_SPANSION_S25FL_BFM is
  generic
    (
      G_INST_NAME : string  := "QSPI_FLASH_SPANSION_S25FL_BFM";
      G_HANDLE_NO : integer := 2
      );
  port (
    tb_stop : in    boolean;                       -- Testbench global stop.
    sclk    : in    std_logic;
    csn     : in    std_logic;
    sdat    : inout std_logic_vector(3 downto 0));
end;"""
如果我像这样稍微修改一下正则表达式:

pattern = re.compile("port\s*\((.*?)\s*\)\s*;") # \s* instead of \s+
然后搜索将在“io_ad:inout std_logic_vector(31到0)”结束,这一点都不好

我想知道我是否可以使用正则表达式来进行类似这样的搜索,也就是说,计算开括号的数目,并且只在所有括号都关闭时停止

如果没有简单的方法,我将使用字符串函数进行简单的字符串搜索来解决它


谢谢。

这里您希望匹配包括换行符在内的字符。因此,请在字符类中使用pattern
\s\s

\s
匹配任何空白字符

\S
匹配任何非空白字符

match3 =re.search(r"port\(([\s\S]+?)\);\s+\n",entBody)
或标志。有助于匹配任何字符,包括换行符

match3 =re.search(r"port\((.+?)\);\s+\n",entBody,re.S)

在这里,您希望匹配包括换行符在内的字符。因此在字符类中使用pattern
\s\s

\s
匹配任何空白字符

\S
匹配任何非空白字符

match3 =re.search(r"port\(([\s\S]+?)\);\s+\n",entBody)
或标志。有助于匹配任何字符,包括换行符

match3 =re.search(r"port\((.+?)\);\s+\n",entBody,re.S)

您可以使用以下正则表达式:

/port\s*\((.+)\)\s*;/s
细分:

port            # matches the characters port literally (case sensitive)
\s*             # match any white space character [\r\n\t\f ] Between zero and unlimited times
\(              # matches the character ( literally
(.+)            # capturing group start - matching any character - Between one and unlimited times
\)              # matches the character ) literally
\s*             # match any white space character [\r\n\t\f ] Between zero and unlimited times
;               # matches the character ; literally

s               # modifier: single line. Dot matches newline characters


更新:如果在
端口(…)之后有其他内容,则可以检查以下正则表达式:

/port\s*\((.+)\)\s*;/s

您可以使用以下正则表达式:

/port\s*\((.+)\)\s*;/s
细分:

port            # matches the characters port literally (case sensitive)
\s*             # match any white space character [\r\n\t\f ] Between zero and unlimited times
\(              # matches the character ( literally
(.+)            # capturing group start - matching any character - Between one and unlimited times
\)              # matches the character ) literally
\s*             # match any white space character [\r\n\t\f ] Between zero and unlimited times
;               # matches the character ; literally

s               # modifier: single line. Dot matches newline characters


更新:如果在
端口(…)之后有其他内容,则可以检查以下正则表达式:

/port\s*\((.+)\)\s*;/s

我截断了它们以便于阅读-你确定保留了相同的格式吗?你如何定义开头/结尾边界和内部内容?我截断了它们以便于阅读-你确定保留了相同的格式吗?你如何定义开头/结尾边界和内部内容?警告一句:这是我将捕获
端口(
和最后一个结束参数
之间的所有文本)
在整个文本中。虽然它在这种特定情况下可能会起作用,但我怀疑这对于现实世界的场景来说是一个好的解决方案。要打破这种解决方案,您需要做的就是将
泛型
部分移到
端口
部分之后。@Rawing感谢您的评论post editedA警告:这将捕获这段之间的所有文本
端口(
和最后一个关闭参数
在全文中。虽然它在这种特定情况下可能会起作用,但我怀疑这对于现实世界的场景来说是一个很好的解决方案。要打破这种解决方案,您需要做的就是将
泛型
部分移到
端口
部分之后。@Rawing感谢您发表的评论。只有当
端口
是最后一个部分时,这才有效代码中的上。例如,如果
通用
部分位于
端口
部分的下方,这将不起作用。此外,您可能希望在结束括号和分号之间允许空白。@Rawing谢谢。我将处理您提到的修改。这仅当
端口
是代码中的最后一部分时才起作用。例如,如果
通用
部分位于
端口
部分的下方,则此操作不起作用。此外,您可能希望在结束符和分号之间允许空白。@Rawing谢谢。我将处理您提到的修改。