在Julia中提取子字符串

3

我正在处理嵌入在syslog消息中的XML。我使用Python删除了<>之外的信息。由于我正在尝试使用Julia,因此我正在尝试找到一种类似的方法。我读到了findfirst的相关资料,但仍无法解决问题。这是样本数据。

Datetime host other stuff <xml data and more data>stuff at the end

我想要的只是<>之间的数据。在Python中我使用:
print(line[line.find(“<“):line.find(“>”)])

Julia中是否有类似的东西?

TIA Joe


这个问题有点含糊不清。Python代码如写的那样,如果>出现在<之前,则返回空字符串,这可能不是您想要的。您可能希望成对的<>,在这种情况下,还有一个问题,即您是要查找开放<后的第一个>还是最后一个>,甚至更微妙的是,匹配相应的<>对。正则表达式方法更加灵活:您可以使用<.?*>表示第一个><.*>表示最后一个>。如果您想要成对,那么您需要比正则表达式更强大的东西。 - StefanKarpinski
3个回答

4

或者您可以使用正则表达式:

julia> str = "Datetime host other stuff <xml data and more data>stuff at the end"
"Datetime host other stuff <xml data and more data>stuff at the end"

julia> rx = r"<(.*?)>"
r"<(.*?)>"

julia> match(rx, str)[1]
"xml data and more data"

如果您想使用Oscar提出的方法,正确的语法应该是:
julia> chop(str[findfirst('<',str):findfirst('>',str)], head=1, tail=1)
"xml data and more data"

最后注意,在Python中,您的代码不会给您想要的结果,因为它会产生:

>>> line = "Datetime host other stuff <xml data and more data>stuff at the end"
>>> print(line[line.find("<"):line.find(">")])
<xml data and more data

正如你所看到的,<字符并没有像你想要的那样从字符串中剥离出来。


Stefan所做的更改使正则表达式变得懒惰。如果字符串中有多个>字符,则差异将是明显的。 - Bogumił Kamiński

3

因为这里涉及到日志处理,所以性能可能比较重要。在这种情况下,请使用SubString{String}(它不会进行内存复制)。另外,当搜索'>'时,您可能希望使用findlast

SubString(line, findfirst('<', line), findlast('>',line))

这是非复制操作,返回一个SubString{String}对象。


1
顺便提一下,match 返回一个 SubString。另外,谈到速度 - 我认为值得注意的是查找 '<' 比查找 "<" 更快。 - Bogumił Kamiński

2
如果您查看findfirst的文档,它会给出正确的用法。在这种情况下,您需要的是println(line[findfirst(line, “<“):findfirst(line, “>”)])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接