使用正则表达式从文本中解析块名和实例名

2024-06-27 09:14:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试解析以下文本

`ifndef abc
`define abc
module xyz(

block
      #(
        .BLK                            (def::a)
    )
    inst
       (/*AUTOINST*/

这是我试过的正则表达式:

(\w+)\s*.*?(\w+)\n*\s*\(\n*\/\*AUTOINST\*\/

预期产出:

Match
1. block
2. inst

实际产量:

Match
1.  ifndef
2.  inst

更新

定义同一代码块有多种方法: 如何用一个正则表达式解析所有这些不同风格代码中的所有块和实例? 如果这是我使用(\w+)\s*.*?(\w+)\n*\s*\(\n*\/\*AUTOINST\*\/regex的测试输入,那么我可以正确地得到5个输出中的4个

block1
#(.en (en))
inst1
(/*AUTOINST*/

block2 inst2
(
/*AUTOINST*/

block3 inst3
(/*AUTOINST*/

block4
#(.en (en))
inst4(/*AUTOINST*/

block5
      #(
        .BLK                            (defs::blk)
    )
    inst5
       (/*AUTOINST*/

输出:

Match 1
1.  block1
2.  inst1
Match 2
1.  block2
2.  inst2
Match 3
1.  block3
2.  inst3
Match 4
1.  block4
2.  inst4

如果开头有多余的行,则第一个匹配不正确:

ifndef abc 

block1
#(.en (en))
inst1
(/*AUTOINST*/

输出:

Match 1
1.  ifndef
2.  inst1

有人能帮我找出问题所在吗?提前谢谢


Tags: 代码matchblockenabcinstblkinst1
2条回答

你可以用

^(\w+)(?:\n(?!\s*\w).*)*\n\s*(\w+)\n\s*\(/\*AUTOINST\*/

模式匹配:

  • ^字符串的开头
  • (\w+)组1中捕获1+个单词字符
  • (?:非捕获组
    • \n(?!\s*\w).*匹配一个换行符并断言在可选的空格字符之后没有单词字符
  • )*关闭组并可选地重复
  • \n\s*匹配换行符和可选的空白字符
  • (\w+)组2中捕获1+个单词字符
  • \n\s*匹配换行符和可选的空白字符
  • \(/\*AUTOINST\*/匹配(/*AUTOINST*/

见aregex demo或aPython demo

例如,使用re.findall返回捕获组值:

import re

regex = r"^(\w+)(?:\n(?!\s*\w).*)*\n\s*(\w+)\n\s*\(/\*AUTOINST\*/"

s = ("`ifndef abc\n"
    "`define abc\n"
    "module xyz(\n\n"
    "block\n"
    "      #(\n"
    "        .BLK                            (def::a)\n"
    "    )\n"
    "    inst\n"
    "       (/*AUTOINST*/")
    
print(re.findall(regex, s, re.MULTILINE))

输出

[('block', 'inst')]

这一个对我有用:

(\w+)([\r\n]+)

这是一个实时的Demo

相关问题 更多 >