我需要使用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)
型
产出
['']
型
预期输出
[' - ']
型
我做错了什么?谢谢你帮忙!
3条答案
按热度按时间nfzehxib1#
这一行就是问题所在:
字符串
您正在检查使用正则表达式找到的字符串是否不在搜索的字符串中,但如果正则表达式没有找到任何内容,则返回一个空列表。当你用' '连接一个空列表时,你得到一个空字符串'',它将始终匹配。
相反,您可以检查正则表达式是否找到任何内容,如果没有,则添加' - '。
范例:
型
如果正则表达式没有找到任何东西,则“match”将是一个空列表。如果'match'是一个空列表,则'if not match'条件将为true,并且' - '将添加到列表中。否则,将添加' '.join(match)。
yv5phkfx2#
之前的问题是,您要检查日志条目中是否有空字符串,这总是正确的。现在,我们直接检查我们的搜索模式是否在日志中没有找到匹配,如果是,我们将' - '插入列表中。
字符串
cl25kdpy3#
如果没有匹配项,正则表达式搜索返回'',它实际上是属性字符串中的 is。因此,第一个表达式的计算结果为true,然后被“not”拒绝,变成false,在这种情况下,else语句发生,将''放入结果列表中。