Python 从似乎没有统一分隔符的字符串中提取值

Python 从似乎没有统一分隔符的字符串中提取值,python,string,Python,String,我有一个日志文件,其中包含与此类似的字符串行 Aug 25 06:45:55 #TS=1598337955#SP=domain.org/shibboleth#IDP=domain.org/idp/shibboleth#USERID=john#DEPT=staff 这些字符串行由值组成;日期、TS、SP、IDP、用户ID和部门,而 Date = Aug 25 06:45:55 TS = 1598337955 SP = domain.org/shibboleth IDP = domain.org/

我有一个日志文件,其中包含与此类似的字符串行

Aug 25 06:45:55 #TS=1598337955#SP=domain.org/shibboleth#IDP=domain.org/idp/shibboleth#USERID=john#DEPT=staff
这些字符串行由值组成;日期、TS、SP、IDP、用户ID和部门,而

Date = Aug 25 06:45:55
TS = 1598337955
SP = domain.org/shibboleth
IDP = domain.org/idp/shibboleth
USERID = john
DEPT = staff
有人能给我建议一种从这些字符串中提取这些值的方法吗,例如TS和USERID?谢谢大家!

您可以使用正则表达式(works):

def extract_from_log(log_line, label):
  if label[-1] != '=':
    label += '='
  start = log_line.index(label)
  end = log_line.index('#', start + len(label))
  return log_line[start + len(label): end]

print(extract_from_log(log_line, 'TS'))
print(extract_from_log(log_line, 'USERID'))
重新导入
对于行内读取器:
linex=str(line)
ts#u value=re.findall('#ts=(.+?)#',linex)
uid_value=re.findall('#USERID=(.+?)#',linex)
将结果添加到列表中将产生以下输出:

['1598337955']]
约翰
如果不想使用任何外部库,请使用此库(不起作用):

对于字符串中的字符串:
对于string.split(“#”)中的元素:
如果元素中有“TS”:
ts_值=元素
如果元素中有“USERID”:
uid\u值=元素

事实上,我自己可能错了。我不知道你可以像
+?
这样链接量词,但匹配
TS=\d+
可能更可靠。@kray89你对TS的选择是正确的,但我不知道TS是否只是数字,它可以是字母数字,但我知道TS的值介于#和以#TS开头,谢谢你的回答!我发现正则表达式解决方案通过先将行解析为字符串来进行一些调整。这给出了输出:
['TS=1598337955']
['USERID=john']
请问您是否知道如何进一步调整代码,只给我它们的值,而不包括它们的“键”,例如
1598337955
而不是
TS=1598337955
是使用re.findall('TS=(.+)#,linex)或re.findall('TS=(.linex.))括号内的任何内容都包含在结果中。此操作非常完美!我可以相应地编辑答案并接受您的解决方案作为最佳答案吗?嗨,欢迎来到SO。在您的示例中,您没有
#UID=
,您有
#USERID=
。这是个错误吗?如果是,请回答您的问题。我还建议你参加一个活动,让自己熟悉这里的工作方式。例如,你需要展示你自己的努力。谢谢你的评论,我非常抱歉没有意识到这个错误,它确实是USERID。我是Python的初学者,我已经仔细研究了这个问题的解决方案,但我的所有发现都无法复制到我的用例中,因为它们要么有统一的分隔符趋势,可以通过列表拆分和提取,要么有固定索引的字符串(例如,总是从第10个字符开始,到第15个字符结束)。我现在正在测试答案中的解决方案,看看它们是否有效,并相应地进行更新。再次感谢!