使用正则表达式,我需要获得预期的输出:
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.5
或TEA 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']
答案 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']