You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正则表达式捕获规则调整:实现指定范围的字符串捕获需求

Python正则表达式捕获问题解答

原代码与当前输出

原Python代码

import re

x = """44
5844 44554  Hi hi!   , sahhashash; asakjas. jjksakjaskjas.
ooooooppkkk"""

# 注释说明
# ((?:\w+)?) ---> 捕获字母数字子串,遇到空格、逗号或句号停止
# ((?:\w\s*)+) ---> 类似上面的规则,但遇到空格不停止
regex_patron_m1 = r"\s*((?:\w+)?) \s*\¿?(?:del |de |)\s*((?:\w\s*)+)\s*\??"

m1 = re.search(regex_patron_m1, x, re.IGNORECASE)

if m1:
    word, association = m1.groups()
    
    print(repr(word)) # 打印第一个捕获组内容
    print(repr(association)) # 打印第二个捕获组内容

当前运行输出

'5844'
'44554  Hi hi'

问题1:捕获组从换行后开始的原因及修改方案

原因

当前正则有三个核心问题:

  1. 开头的\s*会匹配任意空白(包括换行),直接跳过第一行的44;
  2. 第一个捕获组后面跟着强制空格,而第一行44后是换行,不满足匹配条件;
  3. 第二个捕获组((?:\w\s*)+)只能匹配字母数字+空白,遇到!、,这类字符就停了,所以只抓到Hi hi。

修改方案

调整正则,让第一个捕获组匹配第一行的44,第二个捕获组匹配第二行所有内容到换行前:

# 匹配行首的字母数字,然后换行,再匹配到下一个换行前的所有内容
regex_patron_m1 = r"^(\w+)\n([\s\S]*?)(?=\n|$)"

修改后完整代码

import re

x = """44
5844 44554  Hi hi!   , sahhashash; asakjas. jjksakjaskjas.
ooooooppkkk"""

regex_patron_m1 = r"^(\w+)\n([\s\S]*?)(?=\n|$)"

m1 = re.search(regex_patron_m1, x)

if m1:
    word, association = m1.groups()
    
    print(repr(word))
    print(repr(association))

目标输出

'44'
'5844 44554  Hi hi!   , sahhashash; asakjas. jjksakjaskjas.'

问题2:第二个捕获组捕获全部后续内容的修改方案

修改思路

要让第二个捕获组抓完所有后续内容(包括换行),只需要在匹配第一行44后,直接匹配到文本末尾的所有内容即可。

修改后的正则

# ^(\w+)匹配第一行字母数字,\n匹配换行,[\s\S]+匹配所有后续内容(含换行)
regex_patron_m1 = r"^(\w+)\n([\s\S]+)"

修改后完整代码

import re

x = """44
5844 44554  Hi hi!   , sahhashash; asakjas. jjksakjaskjas.
ooooooppkkk"""

regex_patron_m1 = r"^(\w+)\n([\s\S]+)"

m1 = re.search(regex_patron_m1, x)

if m1:
    word, association = m1.groups()
    
    print(repr(word))
    print(repr(association))

目标输出

'44'
'5844 44554  Hi hi!   , sahhashash; asakjas. jjksakjaskjas.\nooooooppkkk'

内容的提问来源于stack exchange,提问作者Matt095

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 22:05:26