正则表达测试器通过,但在 re 里报错...

2021-03-07 01:30:26 +08:00
 qazwsxkevin

getvarValue 这个函数没能写成万金油,但还是能正确析出遇到 JavaScript 的变量,今天遇到一个情况:
var xxx= yyy,对方书写的变量名和等号之间,没有任何字符,就无法析出内容了,于是改了一下正则式,
在测试器里是没问题,能匹配上的,但在 Python 里不行,会报错,请问是怎么回事呢?
谢谢解答了!

# 获取 str 内容中,JavaScript 格式的变量参数内容
def getvarValue(SrcStr,sStr,eStr):
    import re
    searchStr = "(?<={}[\s|\s+|]\=[\s|\s+| ]).*?(?={})".format(sStr,eStr) #能应对标准的 JS 定义变量写法
    tmpStr = re.findall(searchStr,SrcStr)
    if len(tmpStr) == 1:
        return str(tmpStr[0])
    else:
        return str(tmpStr)

SampleText =  " var TeacherID=  667A28;"
result = getvarValue(SampleText,'TeacherID','\;')

# 函数没有内容返回,在正则测试器里,确实无法匹配上,
# 在正则测试里里面,改为(?<=TeacherID[\s|\s+|]?\=[\s|\s+| ]).*?(?=\;)
# 验证匹配通过
 
在 Python 中改为:
searchStr = "(?<={}[\s|\s+|]?\=[\s|\s+| ]).*?(?={})".format(sStr,eStr)
就报错:
    raise error("look-behind requires fixed-width pattern")
sre_constants.error: look-behind requires fixed-width pattern

请问应该怎么破?

2136 次点击
所在节点    Python
3 条回复
iBugOne
2021-03-07 01:39:54 +08:00
Python 自带的 `re` 模块不支持变长的 look-behind,也就是 `(?<=)` 里面的表达式不能有 `*?+{}` 这类长度(重复)修饰符。

推荐的做法是 pip 安装 regex 这个模块,就可以直接用了,你甚至可以 `import regex as re` 而不用担心兼容性问题。

Debian 等发行版里有 `python3-regex` 这个包可以用 apt 安装,效果一样。
GeruzoniAnsasu
2021-03-07 08:47:33 +08:00
可以直接用分组来代替前后向断言,基于分组捕获下来的内容来做判断而不要直接用断言匹配全句,这样能最大程度保证兼容性
zyb201314
2021-03-07 10:58:24 +08:00
#Python3.6 测试通过.
import re
def getvarValue(SrcStr,sStr,eStr):
searchStr = "[{}]\s*\=\s+(\w+?)[{}]".format(sStr,eStr) #能应对标准的 JS 定义变量写法
tmpStr = re.findall(searchStr,SrcStr)
if len(tmpStr) == 1:
return str(tmpStr[0])
else:
return str(tmpStr)

SampleText = " var TeacherID= 667A28;"
result = getvarValue(SampleText,'TeacherID',';')
print(result)
#一>667A28

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/759190

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX