qanniu 发表于 2020-11-23 15:20

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

你要取啥啊 完全看不出你的目的

qanniu 发表于 2020-11-23 15:48

magic78 发表于 2020-11-23 15:43
你要取啥啊 完全看不出你的目的

谢谢回复。

需求:
类似这样的字符串,青色字符串做前置匹配,红色字符串为匹配正文。
示例:SV=5.37 \n\rBV=10.33

lXSATANXt 发表于 2020-11-23 15:54

(?<=SV=\d+\.*\d*\s*\n)BV=\d+\.*\d*
不知道是不是你要的

magic78 发表于 2020-11-23 15:57

本帖最后由 magic78 于 2020-11-23 16:00 编辑

去掉\R就可以 你要BV那断言BV不久好了

lijt16 发表于 2020-11-23 16:01

import re

s = 'SV=5.37 \n\rBV=10'
par = 'SV=.+?(BV=\d+\.?\d*)'
result = re.compile(par, re.S).findall(s)
print(result)


这样不行么?那个什么前置匹配是什么

冥界3大法王 发表于 2020-11-23 16:02

楼主,你没有说明白!
源字符串是啥?
最终哪些要匹配到!
然后才是你的问题。
建议先RegexBuddy自行测试,不会再请教。

lijt16 发表于 2020-11-23 16:10

本帖最后由 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:20

lijt16 发表于 2020-11-23 16:10
lijt16 发表于 2020-11-23 16:01
import re s = 'SV=5.37 \n\rBV=10.22'par = ' ...
编辑器bug真多,总是多出莫名其妙的字符来。

qanniu 发表于 2020-11-23 17:07

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
查看完整版本: python 正则表达式 前置匹配语法请教