gpt4 book ai didi

python反向引用正则表达式

转载 作者:太空狗 更新时间:2023-10-30 02:43:59 25 4
gpt4 key购买 nike

我需要搜索这样的东西:

lines = """package p_dio_bfm is
procedure setBFMCmd (
variable pin : in tBFMCmd
);
end p_dio_bfm; -- end package;

package body p_dio_bfm is
procedure setBFMCmd (
variable pin : in tBFMCmd
) is
begin
bfm_cmd := pin;
end setBFMCmd;
end p_dio_bfm;"""

我需要提取包名称,即 p_dio_bfm 和包声明,即“package p_dio_bfm is”和 FIRST“end p_dio_bfm;”之间的部分

问题是包声明可能以“end p_dio_bfm;”结尾或“结束包”;所以我尝试了以下“OR”正则表达式:- 适用于以“结束包”结尾的包- 不适用于以“end pck_name;”结尾的包

pattern = re.compile("package\s+(\w+)\s+is(.*)end\s+(package|\1)\s*;")
match = pattern.search(lines)

问题出在正则表达式的 (package|\1) 部分,我要在其中捕获单词“package”或匹配的包名称。

更新:我已经提供了一个完整的代码,我希望能澄清它:

import re
lines1 = """package p_dio_bfm is
procedure setBFMCmd (
variable pin : in tBFMCmd
);
end p_dio_bfm;

package body p_dio_bfm is
procedure setBFMCmd (
variable pin : in tBFMCmd
) is
begin
bfm_cmd := pin;
end setBFMCmd;
end p_dio_bfm;"""

lines2 = """package p_dio_bfm is
procedure setBFMCmd (
variable pin : in tBFMCmd
);
end package;

package body p_dio_bfm is
procedure setBFMCmd (
variable pin : in tBFMCmd
) is
begin
bfm_cmd := pin;
end setBFMCmd;
end package;"""

lines1 = lines1.replace('\n', ' ')
print lines1

pattern = re.compile("package\s+(\w+)\s+is(.*)end\s+(package|\1)\s*;")
match = pattern.search(lines1)

print match

lines2 = lines2.replace('\n', ' ')
print lines2

match = pattern.search(lines2)

print match

我希望在这两种情况下,使用唯一的正则表达式来取回这部分:

"""procedure setBFMCmd (
variable pin : in tBFMCmd
);"""

没有我删除的\n 字符。

最佳答案

您的正则表达式不匹配任何内容,因为它不正确。不使用多行标志 。* 将不匹配换行符,因此您可以使用 [\s\S ]*:

r'package ([^\s]+)\s+is([\s\S]*)end\s+(package|\1)\s*;'

查看演示 https://regex101.com/r/tZ3uH0/1

但是这里还有其他一些问题,一个是您的字符串包含 2 个包 block ,这一点是您可以起诉 re.DOTALL 标志的一种更优雅、更高效的方式,它使 '.' 成为了标志。特殊字符完全匹配任何字符,包括换行符。因此您可以像下面这样编写正则表达式:

pattern = re.compile("package\s+(\w+)\s+is(.*)end\s+(package|\1)\s*;",re.DOTALL)

但这仍然会匹配第一个 block :

>>> match = pattern.search(lines)
>>> print match.group(0)
package p_dio_bfm is
procedure setBFMCmd (
variable pin : in tBFMCmd
);
end p_dio_bfm; -- end package;
>>> print match.group(1)
p_dio_bfm
>>> print match.group(2)

procedure setBFMCmd (
variable pin : in tBFMCmd
);
end p_dio_bfm; --
>>> print match.group(3)
package

要匹配所有 block ,您需要在第二组中澄清诸如 body 之类的词:

package\s+(?:\w+\s+?)?([^\s]+)\s+is(.*?)end\s+(package|\1)\s*;

查看演示 https://regex101.com/r/tZ3uH0/3

关于python反向引用正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31385457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com