2012-01-10 187 views
0

我想用正则表达式来解析下面的语句:匹配列表与正则表达式

(o) Multi 
line 
text 
(o) Single line text 
(o) Single line text 

当我使用下面的正则表达式,源的全部文本被捕获:

(?<bullet>\(o\)\) (?<text>.+) 

我想要实现的是有text组的三个匹配,即。

Multi 
line 
text 

然后两次Single line text

如果解决方案是前瞻/后面,如何使用它来实现这一目标?

谢谢。

回答

2

您可以使用先行检查下一个(O)或输入

(?<bullet>\(o\)) (?<text>.*?)(?=\(o\)|$)

+0

工程就像一个魅力。但星号后的问号是什么意思? – grizzly 2012-01-10 22:16:44

+1

这意味着它的懒惰或不合理,基本上它说它会采取最少量的文本匹配。你可以在这里阅读http://www.regular-expressions.info/repeat.html – 2012-01-11 07:37:34

0

只需在正则表达式的末尾添加(o)或EOF,以便在下一个项目符号或文件末尾处切断。我不知道你使用哪种类型的正则表达式来给你确切的正则表达式,但是想法是匹配的。

这是如何在正常的正则表达式匹配EOF: regex to match EOF

0

的到底是为什么使用正则表达式在所有?看起来像你有两种情况 - 一行以子弹开头或不行。如果以子弹开头,请将其关闭,然后用剩余的行开始新的文本对象。如果它不以子弹开头,请将该文本追加到前一个文本对象。伪代码:

text = [] 
i = -1 
for line in data: 
    if line.starts_with('(o)'): 
     i += 1 
     text[i] = line[2:] # all characters in the line after the first three 
    else: 
     text[i].append(line) 
+0

谢谢,这将工作,但我特别需要使用正则表达式。 – grizzly 2012-01-10 22:28:14

+0

不幸的。我认为正则表达式是一种只写语言,因此尽量保留最简单的正则表达式作为最后手段。请至少在正则表达式中提出一些明确的评论,所以当你在六个月内回来时,你不需要解码它。 – 2012-01-11 17:07:14