在正则表达式中的字符后开始匹配

2024-05-19 10:28:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我想要什么

假设我有以下字符串:

"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,所以我不确定如何继续


Tags: 字符串内容列表defjkl解决方案字符abc
1条回答
网友
1楼 · 发布于 2024-05-19 10:28:38

您可以使用Python PyPi regex module\G锚来获得连续的匹配。\G锚点在上一个匹配结束时的字符串开头匹配

使用2个捕获组获取数据,并使用regex.findall从组返回值

模式

(?:^[^→\r\n]*→|\G(?!^))[^\S\r\n]*(\d+)\.[^\S\r\n]*(.*?)[^\S\r\n]*(?=$|\d\.)

解释

  • (?:非捕获组
    • ^[^→\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

代码示例

import regex

pattern = r"(?:^[^→\r\n]*→|\G(?!^))[^\S\r\n]*(\d+)\.[^\S\r\n]*(.*?)[^\S\r\n]*(?=$|\d\.)"

test_str = "Abc def. 2. Ghi jkl. → 1. Mno 2. Pqrs 3. Tu 4 vx 5. yz..."

print(regex.findall(pattern, test_str))

输出

[('1', 'Mno'), ('2', 'Pqrs'), ('3', 'Tu 4 vx'), ('5', 'yz...')]

相关问题 更多 >

    热门问题