python 正则表达式 前置匹配语法请教
本帖最后由 qanniu 于 2020-11-23 17:36 编辑小弟想实现如下匹配:
前置匹配: SV=一串数字,然后空格若干,然后window换行\n\r
然后匹配: 后面的 BV=一串数字
示例:SV=5.37 \n\rBV=10.33
用如下正则表达式无法匹配,请教大家该如何用前置匹配语法(?<=)实现:
(?<=SV\=\d+\.\d+\s+?\n\r)BV=
{
{91,1280,1056, 0, 0, 0},//TV = 13.42(9 lines)AV=2.28 SV=5.37
BV=10.33
{101,1280,1032, 0, 0, 0},//TV = 13.27(10 lines)AV=2.28 SV=5.33
BV=10.22
=======
结帖。
参考 #8 楼大佬lijt16 的解释。
#12 楼我有补充测试说明。
关键词:
前置匹配
不支持变长的后发断言
raise error("look-behind requires fixed-width pattern")零宽断言
你要取啥啊 完全看不出你的目的 magic78 发表于 2020-11-23 15:43
你要取啥啊 完全看不出你的目的
谢谢回复。
需求:
类似这样的字符串,青色字符串做前置匹配,红色字符串为匹配正文。
示例:SV=5.37 \n\rBV=10.33 (?<=SV=\d+\.*\d*\s*\n)BV=\d+\.*\d*
不知道是不是你要的 本帖最后由 magic78 于 2020-11-23 16:00 编辑
去掉\R就可以 你要BV那断言BV不久好了 import re
s = 'SV=5.37 \n\rBV=10'
par = 'SV=.+?(BV=\d+\.?\d*)'
result = re.compile(par, re.S).findall(s)
print(result)
这样不行么?那个什么前置匹配是什么 楼主,你没有说明白!
源字符串是啥?
最终哪些要匹配到!
然后才是你的问题。
建议先RegexBuddy自行测试,不会再请教。 本帖最后由 lijt16 于 2020-11-23 16:22 编辑
lijt16 发表于 2020-11-23 16:01
import re s = 'SV=5.37 \n\rBV=10.22'par = '(?<=SV=).+?(BV=\d+\.?\d*)'
result = re.compile(par, re.S).findall(s)
print(result)
python的re模块并不支持变长的后发断言,只支持定长的后发断言。
你的正则表达式中前部分是不固定长度的,因此会出错,因为不确定SV=后面数字的长度,因此\s+?\n\r不能放入断言。 lijt16 发表于 2020-11-23 16:10
lijt16 发表于 2020-11-23 16:01
import re s = 'SV=5.37 \n\rBV=10.22'par = ' ...
编辑器bug真多,总是多出莫名其妙的字符来。 lXSATANXt 发表于 2020-11-23 15:54
(?
感谢兄台。
就是您理解的意思。
遇到奇怪的问题。
oschina 网页匹配正常,但notepad++ 匹配异常。
如下图。
https://pic.88.uy/images/2020/11/23/image.png
另外,/r/n (windows)还是仅仅/n (linux) 不是关注的点。
我关注在为什么notepad++ 这样的匹配时异常的。
页:
[1]
2