Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取位于';包装';和';endpackage';可选字符串_Python_Python 3.x_Regex_Python 2.7_Re - Fatal编程技术网

Python 获取位于';包装';和';endpackage';可选字符串

Python 获取位于';包装';和';endpackage';可选字符串,python,python-3.x,regex,python-2.7,re,Python,Python 3.x,Regex,Python 2.7,Re,我正在尝试获取package和endpackage可选字符串之外的结构名称。 如果没有package和endpackage字符串,则脚本应返回所有结构名称 这是我的剧本: import re a = """ package new; typedef struct packed { logic a; logic b; } abc_y; typedef struct packed { logic a; logic b; } abc_

我正在尝试获取
package
endpackage
可选字符串之外的结构名称。 如果没有
package
endpackage
字符串,则脚本应返回所有结构名称

这是我的剧本:

import re

a = """
package new;

typedef struct packed
{
    logic a;
    logic b;
} abc_y;

typedef struct packed
{
    logic a;
    logic b;
} abc_t;

endpackage

typedef struct packed
{
    logic a;
    logic b;
} abc_x;

"""

print(re.findall(r'(?!package)*.*?typedef\s+struct\s+packed\s*{.*?}\s*(\w+);.*?(?!endpackage)*', a, re.MULTILINE|re.DOTALL))
这是输出:

['abc_y', 'abc_t', 'abc_x']
预期产出:

['abc_x']
我在正则表达式中遗漏了一些东西,但不知道是什么。有人能帮我修一下吗?提前感谢。

使用

\bpackage.*?\bendpackage\b|typedef\s+struct\s+packed\s*{[^{}]*}\s*(\w+);

解释

--------------------------------------------------------------------------------
\b单词char(\w)和
不是单词char的东西
--------------------------------------------------------------------------------
套餐“套餐”
--------------------------------------------------------------------------------
.*?                      除\n以外的任何字符(0次或更多次
(匹配尽可能少的金额)
--------------------------------------------------------------------------------
\b单词char(\w)和
不是单词char的东西
--------------------------------------------------------------------------------
endpackage“endpackage”
--------------------------------------------------------------------------------
\b单词char(\w)和
不是单词char的东西
--------------------------------------------------------------------------------
|或
--------------------------------------------------------------------------------
typedef‘typedef’
--------------------------------------------------------------------------------
\s+空格(\n、\r、\t、\f和“”)(1或
更多次(与最多金额匹配)
(可能的)
--------------------------------------------------------------------------------
结构'struct'
--------------------------------------------------------------------------------
\s+空格(\n、\r、\t、\f和“”)(1或
更多次(与最多金额匹配)
(可能的)
--------------------------------------------------------------------------------
打包“打包”
--------------------------------------------------------------------------------
\s*空格(\n、\r、\t、\f和“”)(0或
更多次(与最多金额匹配)
(可能的)
--------------------------------------------------------------------------------
{                        '{'
--------------------------------------------------------------------------------
[^{}]*除:“{',“}”(0或更多)以外的任何字符
次数(匹配尽可能多的数量))
--------------------------------------------------------------------------------
}                        '}'
--------------------------------------------------------------------------------
\s*空格(\n、\r、\t、\f和“”)(0或
更多次(与最多金额匹配)
(可能的)
--------------------------------------------------------------------------------
(组和捕获到\1:
--------------------------------------------------------------------------------
\w+字字符(a-z,a-z,0-9,41;)(1或
更多次(与最多金额匹配)
(可能的)
--------------------------------------------------------------------------------
)结束\1
--------------------------------------------------------------------------------
;                        ';'
:

print(列表(过滤器(无,关于findall(r'\bpackage.*?\bendpackage\b | typedef\s+struct\s+packed\s*{[^{}]*}\s*(\w+),'关于DOTALL)))

结果
['abc_x']
@Ryszard Czech,我尝试了你提供的正则表达式,但我得到的输出是:
['''abc_x']
@Sweety
列表(过滤器(无,re.findall(r'\bpackage..-\bendpackage\b| typedef\s+struct\s+package\s+package\s*.[{{{{{{{{}}}}}}}s*(\w+”,a,re.DOTALL))