我正在寻找一个正则表达式来匹配<content>标记内的每个换行符(\n),或者该<content>标记内的任何标记内的每个换行符(例如:
<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>发布于 2009-07-13 05:40:33
实际上..。在这里不能使用简单的正则表达式,至少不能使用。你可能需要担心评论!有人可能会写道:
<!-- <content> blah </content> -->您可以在这里采用两种方法:
注意。
我也不确定你是否可以一次匹配所有的新行。@Quartz建议这样做:
<content>([^\n]*\n+)+</content>这将匹配所有在结束标记前有换行符的内容标记...但是我不确定你所说的匹配所有换行符是什么意思。是否希望能够访问所有匹配的换行符?如果是这样的话,最好的办法是获取所有内容标签,然后搜索嵌套在其中的所有换行符。更像这样的东西:
<content>.*</content>但是有一个警告:正则表达式是贪婪的,所以这个正则表达式将匹配第一个开始标记和最后一个结束标记。相反,您必须抑制正则表达式,这样它才不会贪婪。在python这样的语言中,可以使用"?“正则表达式符号。
我希望通过这篇文章,您可以看到一些陷阱,并弄清楚您想要如何继续。使用XML解析库,然后遍历所有内容标记可能会更好。
我知道我可能没有提供最好的解决方案,但至少我希望你能看到其中的困难,以及为什么其他答案可能不正确……
更新1:
让我更多地总结一下,并在我的回答中添加更多细节。我将使用python的regex语法,因为这是我更习惯的语法(请提前原谅我……您可能需要对某些字符进行转义...评论我的帖子,我会更正它):
要去掉注释,请使用此正则表达式:注意"?“抑制.*以使其非贪婪。
类似地,要搜索内容标记,请使用:.*
此外,您还可以尝试此操作,并使用匹配对象组()访问每个换行符:
<content>(.*?(\n))+.*?</content>我知道我的越狱已经结束了,但它抓住了我的想法。最后一个例子可能行不通,但我认为这是表达你想要的东西的最佳选择。我的建议仍然是:要么抓取所有的内容标签并自己做,要么使用解析库。
更新2:
下面是应该可以工作的python代码。我仍然不确定你所说的“查找”所有换行符是什么意思。你想要整条线吗?或者仅仅是为了计算有多少换行符。要获得实际的行,请尝试:
#!/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>', '']第一个和最后一个空字符串来自紧接在第一个<p>之前和紧跟在</p>之后的换行符。总而言之,这(在很大程度上)起到了作用。尝试使用此代码,并根据您的需要对其进行改进。在中间打印内容,这样您就可以看到正则表达式匹配和不匹配的内容。
希望这能有所帮助:-)。
PS -我没有太多的运气尝试我的正则表达式,从我的第一次更新来捕获所有的换行符…如果你这样做了,请告诉我。
发布于 2009-07-13 05:22:13
<content>(?:[^\n]*(\n+))+</content>https://stackoverflow.com/questions/1117807
复制相似问题