用正则表达式搜索重复的结构

时间:2016-02-09 10:05:21

标签: python regex

我有一个结构字符串:

A_1: text
a lot more text

A_2: some text
a lot more other text

现在我要提取描述性标题(A_1)和以下文字。就像是 [(" A_1","文字\ na更多文字"),(" A_2","一些文字\ na更多其他文字" )]

我使用的表达是

(A_\d+):([.\s]+)

但我只得到[(' A_1',''),(' A_2','')]。

有人对我有想法吗?

提前致谢, 马丁

2 个答案:

答案 0 :(得分:2)

您可以使用lookahead将匹配限制为搜索到的开始指示符的另一次出现。

(?s)A_\d+:.*?(?=\s*A_\d+:|$)
  • (?s) dotall flag使点也匹配换行符
  • A_\d+:您的起始指标
  • .*?尽可能少地匹配(懒惰点)
  • (?=\s*A_\d+:|$)直到前面有可选空格的开始模式或$结束

See demo at regex101.com(Python代码生成器)

答案 1 :(得分:1)

您的[.\s]+匹配一个或多个文字点(因为字符类中的.失去了它的特殊含义)和空格。我认为你的意思是使用.并带有re.DOTALL标志。但是,你可以使用不同的东西,tempered greedy token(还有其他方法)。

您可以使用

(?s)(A_\d+):\s*((?:(?!A_\d).)+)

请参阅regex demo

IDEONE demo

import re
p = re.compile(r'(A_\d+):\s*((?:(?!A_\d).)+)', re.DOTALL)
test_str = "A_1: text\na lot more text\n\nA_2: some text\na lot more other text"
print(p.findall(test_str))

(?:(?!A_\d).)+淬火贪婪令牌将匹配任何文本,直至第一个A_ + digit模式。