V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
qazwsxkevin
V2EX  ›  Python

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

  •  
  •   qazwsxkevin · 2021-03-07 01:30:26 +08:00 · 2150 次点击
    这是一个创建于 1375 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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
    
    

    请问应该怎么破?

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

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

    Debian 等发行版里有 `python3-regex` 这个包可以用 apt 安装,效果一样。
    GeruzoniAnsasu
        2
    GeruzoniAnsasu  
       2021-03-07 08:47:33 +08:00   ❤️ 2
    可以直接用分组来代替前后向断言,基于分组捕获下来的内容来做判断而不要直接用断言匹配全句,这样能最大程度保证兼容性
    zyb201314
        3
    zyb201314  
       2021-03-07 10:58:24 +08:00 via Android   ❤️ 1
    #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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3205 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:41 · PVG 18:41 · LAX 02:41 · JFK 05:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.