忽略正则表达式中不相关的部分

Ignoring irrelevant section in regex

我有以下文字:(这与 密切相关但不相似)

text = '7\n\x0c\n7.\tA B C\n\n7.1\tbla bla bla .\n\n7.2\tanother bla bla \n\n7.3\tand another one.\n\n8.\tX Y Z\n\n8.1\tha ha ha \n\n(a)\thohoho ;\n\n(b)\thihihi,\n\n8'

我希望 select 第 7 节只得到:

7.  A B C

7.1 bla bla bla .

7.2 another bla bla 

7.3 and another one.

我也是:

print(re.findall(r'^\d+\.\s*A B C[^\S\n]*(?:\n\n.+)*', text, re.M)[0])

给出:

7.  A B C

7.1 bla bla bla .

7.2 another bla bla 

7.3 and another one.

8.  X Y Z

8.1 ha ha ha 

(a) hohoho ;

(b) hihihi,

8

如您所见,88.1 之后。所以这似乎让正则表达式感到困惑,我想知道在这种情况下我能做什么?

请注意,部分的数量通常会有所不同,所以我不能做类似的事情 re.findall(r'^7\..*', text, re.MULTILINE)(即A B C可以放在其他section中)

您可以使用

^(\d+\.)\s*A B C(?:\s*\n\b.*)*
  • ^ 字符串开头
  • (\d+\.)\s*A B C 捕获第1组匹配1+个数字和.,然后匹配A B C
  • (?:非捕获组整体匹配
    • \s*\n 匹配可选的空白字符和换行符
    • \b 对组 1 的反向引用后跟单词边界
    • .* 匹配行的其余部分
  • )* 关闭非捕获组并选择性重复

看到一个regex demo.

import re

text = '7\n\x0c\n7.\tA B C\n\n7.1\tbla bla bla .\n\n7.2\tanother bla bla \n\n7.3\tand another one.\n\n8.\tX Y Z\n\n8.1\tha ha ha \n\n(a)\thohoho ;\n\n(b)\thihihi,\n\n8'
pattern = r"^(\d+\.)\s*A B C(?:\s*\n\b.*)*"

m = re.search(pattern, text, re.MULTILINE)
if m:
    print(m.group())

输出

7.      A B C

7.1     bla bla bla .

7.2     another bla bla 

7.3     and another one.

这是找到 7. 和第一个 8. 之间的线的潜在解决方案:

m = re.search(r'^7\.\s*(?:.|\n)+?(?=\n8\.)', text, re.MULTILINE)
print(m.group() if m else None)

输出:

7.  A B C

7.1 bla bla bla .

7.2 another bla bla 

7.3 and another one.