正则表达式捕获规则调整:实现指定范围的字符串捕获需求
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:捕获组从换行后开始的原因及修改方案
原因
当前正则有三个核心问题:
- 开头的
\s*会匹配任意空白(包括换行),直接跳过第一行的44; - 第一个捕获组后面跟着强制空格,而第一行
44后是换行,不满足匹配条件; - 第二个捕获组
((?:\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
相关产品推荐
相关产品推荐

