Python 正则匹配大括号不需要转义? - V2EX
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 5353 次点击
    这是一个创建于 2641 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看下面的代码,匹配字符串 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     Solana     1187 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 23:42 PVG 07:42 LAX 16:42 JFK 19:42
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86