我想要什么
假设我有以下字符串:
"Abc def. 2. Ghi jkl. → 1. Mno 2. Pqrs 3. Tu 4 vx 5. yz..."
现在,我想用Python编写一个正则表达式,在字符→
之后对每个列表项进行匹配和分组,这样每个组都将包含列表项编号和该列表项的内容,如下所示:
('1', 'Mno')
('2', 'Pqrs')
('3', 'Tu 4 vx')
('5', 'yz..')
换句话说,在遇到→
之后,我希望匹配类似以下内容的模式:
'([0-9]+)\.[" "]*(.*)'
我知道显而易见的实用解决方案是拆分字符串,只搜索→
之后的部分,但我更感兴趣的是一个理论上的,可能不太实用的解决方案,只使用正则表达式,以便更好地理解正则表达式
我尝试过的
我已经尝试过像这样使用look Back:
'(?<=→)[" "]*([0-9]+)\.[" "]*(.*?)(?=[0-9]+\.|$)'
它找到了第一个匹配项,但事情似乎变得复杂得多,因为我似乎需要使用另一个查找来匹配不是第一个匹配项的所有内容。但是,由于我不知道第一个列表项的长度,并且Python只支持固定宽度的look behinds,所以我不确定如何继续
您可以使用Python PyPi regex module和
\G
锚来获得连续的匹配。\G
锚点在上一个匹配结束时的字符串开头匹配使用2个捕获组获取数据,并使用regex.findall从组返回值
模式
解释
(?:
非捕获组^[^→\r\n]*→
匹配除换行符或→
之外的任何字符的0+次出现次数|
或\G(?!^)
在上一个匹配的末尾而不是开始处断言位置)
闭合群[^\S\r\n]*
匹配0+个空格,换行符除外(\d+)
捕获组1,匹配1+个数字\.?[^\S\r\n]*
匹配一个可选点,后跟0+空格,换行符除外(.*?)
捕获组2,匹配任何字符0+次非贪婪[^\S\r\n]*
匹配0+尾随空格(?=
正向前瞻,断言右边的是$|\d\.
断言字符串的结尾或匹配数字和点)
关闭前瞻Regex demo in pcrePython demo
代码示例
输出
相关问题 更多 >
编程相关推荐