向包含RegEx的列表解析添加条件

uklbhaso  于 2023-08-08  发布在  其他
关注(0)|答案(3)|浏览(95)

我需要使用RegEx从日志中提取某些值。然后,所有的值都被抛出到一个列表中,稍后将在Pandas数据框中使用。到目前为止,它工作得很好,但问题是不是所有的日志都包含值,如果是这样,我需要添加一个' - ',这样 Dataframe 就不会中断,因为所有数组必须具有相同的长度。
使用下面的代码,我得到了预期的输出:

import re
attribute = "</System><EventData><Data Name='TargetUserName'>superuser</Data><Data Name='TargetDomainName'>ACME</Data>"
username_list = [' - ' if ' '.join(re.findall("(?<=='TargetUserName'>).*?(?=</Data>)",attribute)) not in attribute else ' '.join(re.findall("(?<=='TargetUserName'>).*?(?=</Data>)",attribute))]
print(username_list)

字符串
输出量:

['superuser']


但是如果没有找到表达式,那么我只是得到一个空列表。

attribute = "</System><EventData>superuser</EventData><Data Name='TargetDomainName'>ACME</Data>"
username_list = [' - ' if ' '.join(re.findall("(?<=='TargetUserName'>).*?(?=</Data>)",attribute)) not in attribute else ' '.join(re.findall("(?<=='TargetUserName'>).*?(?=</Data>)",attribute))]
print(username_list)


产出

['']


预期输出

[' - ']


我做错了什么?谢谢你帮忙!

nfzehxib

nfzehxib1#

这一行就是问题所在:

' - ' if ' '.join(re.findall("(?<=='TargetUserName'>).*?(?=</Data>)",attribute)) not in attribute else ' '.join(re.findall("(?<=='TargetUserName'>).*?(?=</Data>)",attribute))

字符串
您正在检查使用正则表达式找到的字符串是否不在搜索的字符串中,但如果正则表达式没有找到任何内容,则返回一个空列表。当你用' '连接一个空列表时,你得到一个空字符串'',它将始终匹配。
相反,您可以检查正则表达式是否找到任何内容,如果没有,则添加' - '。
范例:

import re

attribute = "</System><EventData>superuser</EventData><Data Name='TargetDomainName'>ACME</Data>"
match = re.findall("(?<=='TargetUserName'>).*?(?=</Data>)", attribute)

username_list = [' - ' if not match else ' '.join(match)]
print(username_list)


如果正则表达式没有找到任何东西,则“match”将是一个空列表。如果'match'是一个空列表,则'if not match'条件将为true,并且' - '将添加到列表中。否则,将添加' '.join(match)。

yv5phkfx

yv5phkfx2#

之前的问题是,您要检查日志条目中是否有空字符串,这总是正确的。现在,我们直接检查我们的搜索模式是否在日志中没有找到匹配,如果是,我们将' - '插入列表中。

attribute = "</System><EventData>superuser</EventData><Data Name='TargetDomainName'>ACME</Data>"
username_list = [' - ' if not re.findall("(?<=='TargetUserName'>).*?(?=</Data>)",attribute) else ' '.join(re.findall("(?<=='TargetUserName'>).*?(?=</Data>)",attribute))]
print(username_list)

字符串

cl25kdpy

cl25kdpy3#

如果没有匹配项,正则表达式搜索返回'',它实际上是属性字符串中的 is。因此,第一个表达式的计算结果为true,然后被“not”拒绝,变成false,在这种情况下,else语句发生,将''放入结果列表中。

相关问题