Regex 哪个正则表达式将匹配此(XML)输入模式

Regex 哪个正则表达式将匹配此(XML)输入模式,regex,Regex,我需要解析一个XML片段,如下所示: <tag name="books">books1</tag> <tag name="textBooks"> textBooks1</tag> <tag name="textBooks"> textBooks2</tag> <tag name="textBooks"> textBooks3</tag> <tag name="textBooks">

我需要解析一个XML片段,如下所示:

<tag name="books">books1</tag> 
<tag name="textBooks"> textBooks1</tag> 
<tag name="textBooks"> textBooks2</tag> 
<tag name="textBooks"> textBooks3</tag> 
<tag name="textBooks"> textBooks4</tag> 
<tag name="textBooks"> textBooks5</tag> 
<tag name="books">books2</tag> 
<tag name="textBooks"> textBooks1</tag> 
<tag name="textBooks"> textBooks2</tag> 
<tag name="books">books3</tag>
<tag name="textBooks"> textBooks4</tag> 
<tag name="textBooks"> textBooks5</tag> 

如果您的问题实际上只是“哪个正则表达式将匹配
”,那么答案就是

您的输出示例似乎希望在每次出现之前插入一个空行(第一次除外),因此可以尝试以下操作

sed '1b;/<tag name="books">/i\
' xml-fragment.txt
(<tag name="books">[^<>]*(?:</tag>\s*<tag name="textBooks">[^<>]*)*</tag>)
lines = file.read()
re.match(regex, lines)
:
其中,
\s
匹配regex实现中的空格(包括换行符),regex实现包括Perl扩展(因此,不是
sed
,而是大多数现代编程语言,包括PHP[我在这里用一句诙谐的话说明它适合于……大多数事情]和Python)

请注意,默认情况下,许多正则表达式实现都是面向行的——将上述多行正则表达式应用于单行输入肯定不起作用。但是假设你在做类似的事情

sed '1b;/<tag name="books">/i\
' xml-fragment.txt
(<tag name="books">[^<>]*(?:</tag>\s*<tag name="textBooks">[^<>]*)*</tag>)
lines = file.read()
re.match(regex, lines)
:
你应该发现它做了你想要的


正如注释中指出的,您确实应该使用XML工具进行XML输入。如果您的输入不是正确的XML,也许您可以对其进行预处理,然后对其进行后处理,删除预处理器必须添加的内容,以使其为XML处理管道所接受。

不要使用正则表达式解析XML。有专门的更方便的工具用于此。但我的要求是解析此xml并获取其中的数据。您自己已经尝试过什么?您发布的内容可能看起来像XML,但事实并非如此。如果它只是您输入的一小部分,并且您的输入是XML,那么为什么不使用某种XML解析器呢?我正在使用xpath来解析XML。但是这个xml没有开始和结束节点来获取内容。您所说的“获取”标记是什么意思?您的输出看起来像是在每个内部
元素之前添加了一个空行,但您的问题并没有说明如何修改输入。非常感谢。它工作得很好。但我想了解你写的正则表达式。你能简单介绍一下吗?试试看