【问题标题】:regex doesn't seem to work on the input given as expected正则表达式似乎不适用于预期的输入
【发布时间】:2021-06-20 11:31:55
【问题描述】:

我的正则表达式似乎没有按预期工作,有人可以帮我解决它吗?

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')

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

【问题讨论】:

  • 好吧,你的第一个块中还有[F-1:0],这在你的正则表达式中没有考虑。

标签: python python-3.x regex python-2.7


【解决方案1】:

"(\w+)\s+#\s?(\D*\S*\D*\s*\d?\W+)\s*(\w+)"gm

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

【讨论】:

    【解决方案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 组:一个或多个单词字符
    • [^()]* - 除了() 之外的零个或多个字符
    • \( - 一个 ( 字符。

    或者,我认为您可以利用 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* - # 包含零个或多个空格
    • (\((?:[^()]++|(?2))*\)) - 第 2 组:一个 ( 字符,然后出现任何零个或多个除 () 或第 2 组模式之外的任何一个或多个字符,然后是 )
    • \s* - 零个或多个空格
    • (\w+) - 第 2 组:一个或多个单词字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      • 2013-05-01
      • 2013-09-08
      • 2019-08-26
      相关资源
      最近更新 更多