【问题标题】:What is the problem with the following regex?以下正则表达式有什么问题?
【发布时间】:2018-10-10 14:17:15
【问题描述】:

我必须将以下语句分为 3 组:

DFFX1 _pcpi_insn_reg_16_  ( .D(n13328), .CK(clk), .Q(pcpi_insn_16_) );
Group1: DFFX1
Group2: _pcpi_insn_reg_16_
Group3:  .D(n13328), .CK(clk), .Q(pcpi_insn_16_) 

我正在使用:(.*) (.*) \((.*)\);

输出是:

Group1: DFFX1 _pcpi_insn_reg_16_
Group2: *empty*
Group3:  .D(n13328), .CK(clk), .Q(pcpi_insn_16_) 

你能解释一下为什么这不起作用吗?

【问题讨论】:

  • 我在这里测试了这个:regex101.com/r/swxskr/1 并且你的正则表达式工作正常,所以你的问题可能在你的代码中的其他地方。请添加更多链接到此正则表达式的代码/上下文。
  • @SvenHakvoort 我已经更新了这个问题。由于示例位于引号块中,_pcpi_insn_reg_16_( 之间的双空格不可见。要解析的文本现在位于代码块中,以防止删除双空格。

标签: python regex regex-group


【解决方案1】:

它不起作用,因为默认情况下正则表达式是贪婪的。换句话说,第一个.* 将在屈服于第二个之前消耗尽可能多的目标文本。您应该使您的模式更具限制性以解决此问题。例如:

import re

pattern = r'([\S]+) ([\S]+) \((.*)\)'
text = 'DFFX1 _pcpi_insn_reg_16_ ( .D(n13328), .CK(clk), .Q(pcpi_insn_16_) );'

m = re.match(pattern, text)
print m.groups()

而不是匹配任何字符,这仅匹配不是空白字符的字符(这就是\S 所做的)。这将打印这些组:

('DFFX1', '_pcpi_insn_reg_16_', ' .D(n13328), .CK(clk), .Q(pcpi_insn_16_) ')

【讨论】:

    【解决方案2】:

    正则表达式可以更严格地工作:

    '(\w*)\s(\w*)\s\((.*)\)'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-13
      相关资源
      最近更新 更多