regex似乎无法按预期处理给定的输入

2024-09-28 18:59:30 发布

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

我的正则表达式似乎不能按预期工作,有人能帮我修复它吗

import re
a = """
xyz # (.C           (0),
       .H           (1)
              )
  mv [F-1:0] (/*AUTOINST*/

except_check
          #(
            .a        (m),
            .b        (w),
            .c        (x),
            .d        (1),
            .e        (1)
        )
        data_check
           (// Outputs

abc
      #(
        .a    (b::c)
    )
    mask
       (/*AUTOINST*/
"""
op = re.findall(r'^\s*(\w+)\s*$\n(?:^\s*[^\w\s].*$\n)*^\s*(\w+)\s*\(', a, re.MULTILINE)
for i in op:
    print(i)

这是我得到的输出:

('except_check', 'data_check')
('abc', 'mask')

这是预期输出:

('xyz', 'mv')
('except_check', 'data_check')
('abc', 'mask')

不知何故,正则表达式不适用于第一个输入块,而适用于其他两个输入块


Tags: importrefordatacheckmaskoutputsmultiline
2条回答

下面是一个具有最小更改的正则表达式:

^\s*(\w+)(?:\s*[^\w\s].*$\n)*^\s*(\w+)[^()]*\(

regex demo

\s*$\n(?:^\s*[^\w\s]部分替换为(?:\s*[^\w\s],因为第一个块不包含换行符

最后,\s*\(被替换为[^()]*\(,因为要提取的单词和(字符之间除了空格之外还有其他字符

详细信息

  • ^-行的开头(允许您使用re.M
  • \s*-零个或多个空格
  • (\w+)-组1:一个或多个单词字符
  • (?:\s*[^\w\s].*\n)*-零个或多个空格、除_之外的特殊字符、行的其余部分和LF字符的出现次数为零或多
  • ^-行的开始
  • \s*-零个或多个空格
  • (\w+)-第2组:一个或多个单词字符
  • [^()]*-除()之外的零个或多个字符
  • \(-a(字符

或者,我认为您可以利用PyPi正则表达式中的递归特性。在终端/控制台中运行pip install regex,然后

import regex
a = 'your_string_here'
rx = r'^\s*(\w+)\s*#\s*(\((?:[^()]++|(?2))*\))\s*(\w+)'
matches = [(x.group(1), x.group(3)) for x in regex.finditer(rx, a, regex.M)] 

这是regex demo。它匹配:

  • ^-行的开始
  • \s*-零个或多个空格
  • (\w+)-组1:一个或多个单词字符
  • \s*#\s*-a#包含零个或多个空格
  • (\((?:[^()]++|(?2))*\))-第2组:一个(字符,然后是除()或第2组模式以外的任何一个或多个字符的任何零次或多次出现,然后是一个)
  • \s*-零个或多个空格
  • (\w+)-第2组:一个或多个单词字符

“(\w+)\s+\s?(\D*\s*\D*\s*\D?\w+\s*(\w+)”gm

用这个工作 你可以进一步简化

相关问题 更多 >