regex 正则表达式,用于查找行组,其中组中以某个字符串开头的某些行出现多次

ewm0tg9j  于 2023-03-24  发布在  其他
关注(0)|答案(2)|浏览(144)

我有一个文件,有多行。我需要一个正则表达式,找到所有的组,包含一个特定的字符串多次出现。如果该文件有:
启动
中间
随机
中间
结束
启动
中间
随机
结束
启动
中间
随机
中间
结束
我希望正则表达式只匹配粗体的行,作为MIDDLE出现多次的单独组:

**开始

中间
随机
中间
结束**
启动
中间
随机
结束开始
中间
随机
中间
结束

我已经尝试了这个和几个变化,但它不匹配的群体,我需要的。

(START(?:\nMIDDLE){2,}(?:\nMIDDLE)*\nEND)
(START\*STUFF~(?:\nMIDDLE\*STUFF~){2,}(?:\nMIDDLE\*STUFF~)*\nEND\*STUFF~)
7vhp5slm

7vhp5slm1#

使用两个表达式:

import re

data = """
START
MIDDLE
RANDOM
MIDDLE
END
START
MIDDLE
RANDOM
END
START
MIDDLE
RANDOM
MIDDLE
END
"""

rx_block = re.compile(r'^START.+?^END', re.M | re.S)
rx_inner = re.compile(r'MIDDLE')

for block in rx_block.finditer(data):
    occurences = rx_inner.findall(block.group(0))
    if len(occurences) > 1:
        print(block.group(0))

参见a demo on ideone.com

ryevplcw

ryevplcw2#

您可以匹配正则表达式

^START\n(?:(?:(?!END\n).*\n)*MIDDLE\n){2}(?:.*\n)*?END$

RE.M
Demo
正则表达式可以分解如下。

^           # match beginning of a line
START\n     # match literal then line terminator
(?:         # begin a non-capture group
  (?:       # begin a non-capture group
    (?!     # begin a negative lookahead
      END   # match literal
      \n    # match line terminator
    )       # end negative lookahead
    .*      # match zero or more characters other than line terminators
    \n      # match line terminator
  )         # end non-capture group
  *         # execute preceding non-capture group zero or more times
  MIDDLE\n  # match literal then line terminator
){2}        # end non-capture group, execute it twice 
(?:         # begin a non-capture group
  .*\n      # match zero or more characters then line terminator
)           # end non-capture group
*?          # execute the preceding non-capture group zero or more times,
            # as few times as possible (lazily) 
END$        # match literal at end of line

如果需要匹配Windows(使用"\r\n"作为行终止符)生成的字符串,请将正则表达式中的每个\n示例更改为\r?\n
请注意,可以通过更改

(?:(?!END\n)

到 * 贪婪量词 *

(?:(?!(?:END|MIDDLE)\n)

比较(?:(?!END\n)(703步,0.8ms)与(?:(?!(?:END|MIDDLE)\n)(511步,0.2ms)的步骤数和执行时间。

相关问题