正则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> -->
你可以在这里采取两种方法:
- 首先排除所有评论。 然后使用正则expression式的方法。
- 不要使用正则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>