正则expression式匹配<content>标签内的每个新行字符(\ n)

我正在寻找一个正则expression式来匹配<content>的XML标签内的每个新行字符( \n ),或者是<content>标签内的任何标签内的每个新行字符( \n ),例如:

 <blog> <text> (Do NOT match new lines here) </text> <content> (DO match new lines here) <p> (Do match new lines here) </p> </content> (Do NOT match new lines here) <content> (DO match new lines here) </content> 

其实…你不能在这里使用一个简单的正则expression式,至less不是一个。 您可能需要担心评论! 有人可能会写:

 <!-- <content> blah </content> --> 

你可以在这里采取两种方法:

  1. 首先排除所有评论。 然后使用正则expression式的方法。
  2. 不要使用正则expression式,并使用上下文相关的parsing方法来跟踪是否嵌套在注释中。

小心。

我也不太确定你可以同时匹配所有的新线。 @Quartzbuild议这样一个:

 <content>([^\n]*\n+)+</content> 

这将匹配任何内容标签,在结束标签之前有一个换行符RIGHT …但是我不确定匹配所有换行符是什么意思。 你想能够访问所有匹配的换行符? 如果是这样,你最好的办法是抓住所有的内容标签,然后search所有嵌套在中间的换行符。 更像这样的东西:

 <content>.*</content> 

但是有一个CAVEAT:正则expression式是贪婪的,所以这个正则expression式将匹配第一个开始标签到最后一个closures标签。 相反,你必须压制正则expression式,所以它不是贪婪的。 在像Python这样的语言中,你可以用“?” 正则expression式符号。

我希望通过这个,你可以看到一些陷阱,并找出你想如何继续。 您最好使用XMLparsing库,然后迭代所有内容标签。

我知道我可能不会提供最好的解决scheme,但至less我希望你会看到这方面的困难以及为什么其他答案可能不正确。

更新1:

让我再总结一下,并在我的回答中增加一些细节。 我将使用python的正则expression式语法,因为它是我更习惯的(提前原谅我…你可能需要逃避一些字符…评论我的post,我会改正它):

去掉评论,使用这个正则expression式:注意“?” 压制。*使其不贪婪。

同样,要search内容标签,请使用:。*?

另外,您可以尝试一下,并用匹配对象groups()访问每个换行符:

 <content>(.*?(\n))+.*?</content> 

我知道我的逃跑是closures的,但是它抓住了这个想法。 最后一个例子可能不起作用,但我认为这是expression你想要的最好的select。 我的build议仍然是:抓住所有的内容标签,并自己动手,或使用parsing库。

更新2:

所以这里是应该工作的Python代码。 我仍然不确定你的意思是“find”所有换行符。 你想要整个行吗? 或者只是要计算多less换行符。 要获得实际的线路,请尝试:

 #!/usr/bin/python import re def FindContentNewlines(xml_text): # May want to compile these regexes elsewhere, but I do it here for brevity comments = re.compile(r"<!--.*?-->", re.DOTALL) content = re.compile(r"<content>(.*?)</content>", re.DOTALL) newlines = re.compile(r"^(.*?)$", re.MULTILINE|re.DOTALL) # strip comments: this actually may not be reliable for "nested comments" # How does xml handle <!-- <!-- --> -->. I am not sure. But that COULD # be trouble. xml_text = re.sub(comments, "", xml_text) result = [] all_contents = re.findall(content, xml_text) for c in all_contents: result.extend(re.findall(newlines, c)) return result if __name__ == "__main__": example = """ <!-- This stuff ought to be omitted <content> omitted </content> --> This stuff is good <content> <p> haha! </p> </content> This is not found """ print FindContentNewlines(example) 

这个程序打印结果:

  ['', '<p>', ' haha!', '</p>', ''] 

第一个和最后一个空string来自紧接在第一个<p>和紧跟在</p>之后的换行符。 总而言之(大部分)都是这样做的。 试用这个代码,并根据您的需求进行优化。 打印中间的东西,所以你可以看到正则expression式匹配和不匹配。

希望这可以帮助 :-)。

PS – 我没有太多的运气尝试从我的第一次更新我的正则expression式捕获所有的换行符…让我知道,如果你这样做。

 <content>(?:[^\n]*(\n+))+</content>