使用空格后跟字符串或行尾提取文本

时间:2018-04-25 07:26:26

标签: python regex

使用正则表达式,我需要获得预期的输出:

string="Tue Apr 24 22:35:48 2018 53/e33 
hello:55|Wordcap|abc|abc generate|6|Wordcapdata_proto_req=WINTER Wordcapdata_sample_resp=summer 2.4.5 WordcapTotal_reject=56 WordcapAddition_sum=TEA CUP ONE"

Expected output = ['data_proto_req=WINTER', 'data_sample_resp=summer 2.4.5', 'Total_reject=56', 'Addition_sum=TEA CUP ONE']

问题在于处理这些字符串中的空格:summer 2.4.5TEA CUP ONE

这是我试图获得正则表达式的尝试:

print re.findall(r'[W]*ordcap([^|].*?=.*?)[\s|\t]*(?:W|$)', string)

我得到的输出是:

['data_proto_req=', 'data_sample_resp=summer 2.4.5', 'Total_reject=56', 'Addition_sum=TEA CUP ONE']

3 个答案:

答案 0 :(得分:1)

请注意,(?:W|$)在下一场比赛中消耗了W,因此您使用了[W]*。实际上,这是应该使用lookarounds的情况,因为它们不使用文本,只是检查是否匹配,而不将匹配的文本放入匹配值。

您可以使用

\bWordcap([^|=]*=.*?)(?=\s*\bWordcap|$)

请参阅regex demo

<强>详情

  • \bWordcap - 一个单词边界,后跟Wordcap
  • ([^|=]*=[^|]*?) - 第1组:
    • [^|=]* - |=以外的任何0 +字符,尽可能多
    • = - =标志
    • .*? - 除了换行符之外的任何0 +字符,尽可能少
  • (?=\s*\bWordcap|$) - 一个正向前瞻,需要0+空格,一个单词边界和Wordcap字符串,紧靠当前位置的右侧或字符串的结尾。

请参阅Python demo

import re
rx = r"\bWordcap([^|=]*=.*?)(?=\s*\bWordcap|$)"
s = "Tue Apr 24 22:35:48 2018 53/e33 \nhello:55|Wordcap|abc|abc generate|6|Wordcapdata_proto_req=WINTER Wordcapdata_sample_resp=summer 2.4.5 WordcapTotal_reject=56 WordcapAddition_sum=TEA CUP ONE"
print(re.findall(rx, s))
# => ['data_proto_req=WINTER', 'data_sample_resp=summer 2.4.5', 'Total_reject=56', 'Addition_sum=TEA CUP ONE']

答案 1 :(得分:0)

这是您的解决方案,

myStr = """Tue Apr 24 22:35:48 2018 53/e33 hello:55| 
Wordcap|abc|abc generate|6|Wordcapdata_proto_req=WINTER 
Wordcapdata_sample_resp=summer 2.4.5 WordcapTotal_reject=56 
WordcapAddition_sum=TEA CUP ONE"""

print(re.findall(r'(?<=Wordcap)[^|]*?(?= Wordcap|$)', myStr))

# ['data_proto_req=WINTER', 'data_sample_resp=summer 2.4.5',
# 'Total_reject=56', 'Addition_sum=TEA CUP ONE']

答案 2 :(得分:0)

print(re.findall(r'Wordcap([^|].*?=.*?)(?= Wordcap|$)', string))

给出

['data_proto_req=WINTER', 'data_sample_resp=summer 2.4.5', 'Total_reject=56', 'Addition_sum=TEA CUP ONE']