我有一个结构字符串:
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','')]。
有人对我有想法吗?
提前致谢, 马丁
答案 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
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
模式。