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

还是我,再来问一个关于正则表达式的问题

  •  
  •   sqf3903 · 2017-08-19 12:19:26 +08:00 · 2334 次点击
    这是一个创建于 2435 天前的主题,其中的信息可能已经有所发展或是发生改变。

    import re

    p = re.compile(r'(\b\w+)\s+\1')

    a = p.search('Paris in the the spring').group() print(a) 代码如上,执行结果是:the the 在 Python3 中使用原始字符串写正则表达式,\b 在这里我的理解是“单词”边界,也就是 Paris in the the spring 的开头和结尾位置,\w 是匹配任意 Unicode 单词字符,+是执行至少一次\w,然后再是匹配空白字符(\s 的意思),+是执行至少一次\s,\1 是再一次执行前面的所有匹配。 这里我想问的是为什么是从 the 开始匹配,而不是从 Paris 开始。 如果是从 the 开始,那结果为什么不是 “ the 空格 the 空格” 即 “ the the ” 而是“ the 空格 the ” 即 “ the the ”

    9 条回复    2017-08-20 15:31:35 +08:00
    azh7138m
        1
    azh7138m  
       2017-08-19 12:28:06 +08:00 via Android
    最后一个问题是因为,你写的是
    (\b\w+)\s+\1
    而不是
    (\b\w+\s+)\1
    所以是"the the"
    ethanlu
        2
    ethanlu  
       2017-08-19 12:29:46 +08:00 via Android
    整个正则是括号匹配到的在 s+之后再匹配一次,你字符串里面就只有 the 空格 the 符合。为什么不是 the 空格 the 空格,你把第一个右括号移到+s 后面应该就是了。
    x18960
        3
    x18960  
       2017-08-19 12:35:32 +08:00 via iPhone
    这个东西 你应该去菜鸟教程看看,我就在那里学的,这个叫反向引用
    dallaslu
        4
    dallaslu  
       2017-08-19 12:50:35 +08:00
    \b 是正则表达式规定的一个特殊代码(好吧,某些人叫它元字符,metacharacter ),代表着单词的开头或结尾,也就是单词的分界处。虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是\b 并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置。

    http://www.jb51.net/tools/zhengze.html
    sqf3903
        5
    sqf3903  
    OP
       2017-08-19 13:24:18 +08:00 via iPhone
    @azh7138m 多谢解惑,明白了!
    sqf3903
        6
    sqf3903  
    OP
       2017-08-19 13:29:27 +08:00 via iPhone
    @x18960 兄弟,给个链接吧
    sqf3903
        7
    sqf3903  
    OP
       2017-08-19 13:30:55 +08:00 via iPhone
    @dallaslu 等我缓过来再看,现在头有点大
    x18960
        8
    x18960  
       2017-08-19 14:33:08 +08:00 via iPhone
    @sqf3903 百度菜鸟教程 ro 什么的网址
    code42
        9
    code42  
       2017-08-20 15:31:35 +08:00
    第一个问题:
    你用的是 search,而不是 match

    第二个问题:
    反向引用之前匹配的(\b\w+)中不包含空格

    直接 help(re)告诉你所有真相:)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1008 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 18:58 · PVG 02:58 · LAX 11:58 · JFK 14:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.