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
pheyer
V2EX  ›  Python

Python 正则匹配大括号不需要转义?

  •  
  •   pheyer · 2018-07-24 11:58:48 +08:00 · 4683 次点击
    这是一个创建于 2074 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看下面的代码,匹配字符串 a 中的三个大括号,两个正则表达式中一个对大括号进行了转义,一个没有转义,居然都能匹配成功,结果是一样的['{{{'],这是为何?是因为正则表达式中第一个大括号不是成对出现的有智能处理?

    import re
    
    a = '{{{}}}'
    print re.findall('{{3}',a)
    print re.findall('\{{3}',a)
    
    5 条回复    2018-07-26 10:10:13 +08:00
    pheyer
        1
    pheyer  
    OP
       2018-07-24 16:45:01 +08:00
    这题是太难还是太简单?
    import re

    a = '{{{}}}'
    print re.findall('{{3}',a)
    print re.findall('\{{3}',a)
    print re.findall('\\{{3}',a)
    上面的代码输出同样的结果,都能匹配到三个大括号。

    而把匹配的左大括号换成左括号时,第一个 print 会报错,后面两个就没有问题,说明并不是遇到不是成对处理的括号有智能处理?
    import re

    a = '(((}}}'
    print re.findall('({3}',a)
    print re.findall('\({3}',a)
    print re.findall('\\({3}',a)

    参考了一下 https://www.cnblogs.com/dyfblog/p/6088582.html,还是不能完全解释
    VicaYang
        2
    VicaYang  
       2018-07-26 01:51:26 +08:00
    查了下文档没有找到有用的信息,个人倾向于认为其采用的引擎在 parse 这个 pattern 的时候自然而然地会去检查{的合法性,包括有无闭合,以及闭合后是不是合法的一个“数字+逗号”的区间形式。如果不是的话整个会被作为正常的字符串来解析,简单说就是一个语法糖。无论何时,使用"\{"来匹配"{"永远不是一个错误的选择
    pheyer
        3
    pheyer  
    OP
       2018-07-26 09:41:17 +08:00
    @VicaYang 你说的这个合法性若替换成我后面说的小括号就是有问题的,即
    a = '(((}}}'
    print re.findall('({3}',a)
    这种情况是有问题的。
    按照我提供的附加链接里面的说法,最正确的应该是用\\{, \{应该是识别不了,可能是有容错处理
    VicaYang
        4
    VicaYang  
       2018-07-26 10:04:40 +08:00
    做转义用的'\'需不需要再次转义和语言特性有关,得看他的解析器怎么写的。据我所知好像 r 和 java 是需要\\{这样写的,cpp 忘了,绝大多数文本编辑器都是不需要的
    VicaYang
        5
    VicaYang  
       2018-07-26 10:10:13 +08:00
    BTW,有些引擎对于'\\({3}'也是直接报错的,因为前两个表示不转义的'\',第三个'('因为不匹配直接报错(正则引擎对于小括号特别严格,大括号好像普遍放一马)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1367 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 23:34 · PVG 07:34 · LAX 16:34 · JFK 19:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.