我在用分号分隔的文件中得到了以下几行:
8=FIX.4.2;9=159;35=A;56=MBT;34=1;7202=asdf:asdf;52=20130624-04:10:00.843;43=Y;98=0;10=000;Timestamp=Fri July 25 1958 16:12:52:112545;MsgDirection=1;
我想要的是整个消息,直到10 = 000;并将值7202设为asdf:asdf。
我懂了:
(^.*000;)
根据正则表达式应该让我整行直到10 = 000;。太好了但是,如果我这样做:
(^.*000;)(7202=.*;)
根据regex101.com的说法,我什么都不会匹配。
我不知道为什么添加第二分组会使整个表达式无效。
任何帮助都会很棒。
谢谢
最佳答案
第一个问题的答案
“我正在尝试将正则表达式与python一起使用,以从7202 =中提取数据,因此我想获取asdf:asdf。”
如果我理解正确,那么您的目标是找到7202=
和;
之间的数据。在这种情况下:
>>> import re
>>> line = "8=FIX.4.2;9=159;35=A;56=MBT;34=1;7202=asdf:asdf;52=20130624-04:10:00.843;43=Y;98=0;10=000;Timestamp=Fri July 25 1958 16:12:52:112545;MsgDirection=1;"
>>> re.search('7202=([^;]*);', line).group(1)
'asdf:asdf'
正则表达式为
7202=([^;]*);
。这符合:文字字符串
7202=
紧随但不包括第一分号的所有字符:
([^;]*)
。因为它在括号中,所以被捕获为组1。文字字符
;
回答第二版问题
“我想要的是整个消息,直到10 = 000;并且7202的值将为asdf:asdf。”
>>> import re
>>> line = "8=FIX.4.2;9=159;35=A;56=MBT;34=1;7202=asdf:asdf;52=20130624-04:10:00.843;43=Y;98=0;10=000;Timestamp=Fri July 25 1958 16:12:52:112545;MsgDirection=1;"
>>> r = re.search('.*7202=([^;]*);.*10=000;', line)
>>> r.group(0), r.group(1)
('8=FIX.4.2;9=159;35=A;56=MBT;34=1;7202=asdf:asdf;52=20130624-04:10:00.843;43=Y;98=0;10=000;', 'asdf:asdf')
正则表达式为
.*7202=([^;]*);.*10=000;
。这符合:7202=
以下的所有内容:.*7202=
紧接但不包括第一个分号的所有字符:
([^;]*)
。因为它在括号中,所以被捕获为组1。以
;
开头并以10=000;
结尾的任何字符:;.*10=000;
整个匹配字符串的值可作为
r.group(0)
使用。组1的值可作为r.group(1)
使用。因此,单个匹配对象r
让我们获得两个字符串。