Python中如何复用已匹配正则并提取#数字间所有文本块?
Python正则表达式提取
#数字间文本的解决方案 我来帮你解决这个正则匹配的问题~你遇到的核心问题是原正则会消耗掉中间的#数字标记,导致下一个匹配无法复用这个标记作为起始点,咱们来调整一下正则规则:
原正则的问题
你的初始正则 (?s)(\#\d{1,})(.*?)(\#\d{1,}) 采用“起始#数字 + 中间内容 + 结束#数字”的结构,但每次匹配会把结尾的#数字消耗掉,导致下一次匹配只能从这个#数字之后开始,自然就遗漏了以这个#数字为起始的文本块。
修改后的正则
我们可以用**正向预查(lookahead)**来避免消耗结尾的#数字,修改后的正则如下:
(?s)(#\d+)(.*?)(?=#\d+|$)
正则各部分解释
(?s):开启单行模式,让.能匹配换行符,保证跨多行的内容能被正确捕获(#\d+):捕获起始的#数字标记(比如#0、#600)(.*?):非贪婪匹配中间的所有内容,避免过度匹配到后面的块(?=#\d+|$):正向预查,匹配“后面跟着#数字”或者“文本结尾”的位置,不会消耗这个#数字,这样下一次匹配就能直接从这个#数字开始
Python代码示例
下面是用这个正则提取内容的完整代码:
import re # 你的目标文本 target_text = """#0 $dumpvars 0! 0" 0# bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 7 bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 6 bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 5 b0000000000000000 $ bxxxxxxxxxxxxxxxx / bxxxxxxxxxxxxxxxx . bxxxxxxxxxxxxxxxx ) b0111111111111111 % bxxxxxxxxxxxxxxxx 1 bxxxxxxxxxxxxxxxx 0 bxxxxxxxxxxxxxxxx * b10101010101010101010101010101010 & bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx , bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 2 bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 3 bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 4 bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ( bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ' $end #600 1! b0000000000000000 ) b0111111111111111 * b10101010101010101010101010101010 + b0000000000000000 / b0111111111111111 1 b00000000000000000000000000000000 5 b10101010101010101010101010101010 4 b00000000000000000000000000000000 2 b00000000000000000000000000000000 3 b010101010101010101010101010101010 7 #1200 """ # 编译正则表达式 pattern = re.compile(r'(?s)(#\d+)(.*?)(?=#\d+|$)') # 提取所有匹配结果 all_blocks = pattern.findall(target_text) # 遍历输出每个块 for start_tag, content in all_blocks: print(f"=== 从{start_tag}开始的内容 ===") print(content.strip()) print("=========================")
运行这段代码后,你会得到两个完整的文本块:
#0到#600之间的内容#600到#1200之间的内容
内容的提问来源于stack exchange,提问作者MagikarpSama
相关产品推荐
相关产品推荐

