python - 有关正则表达式的问题
大家讲道理
大家讲道理 2017-04-18 10:13:03
[Python讨论组]
In [60]: re.findall('(?m)\s+(?!noreply|postmaster)(\w+)',
"""
    sales@phptr.com
    postmaster@phptr.com
eng@phptr.com
noreply@phptr.com
"""
)
Out[60]: ['sales', 'eng']
In [61]: re.findall('(?m)\s+',
"""
    sales@phptr.com
    postmaster@phptr.com
eng@phptr.com
noreply@phptr.com
"""
)
Out[61]: ['\n    ', '\n    ', '\n', '\n', '\n']
In [62]: re.findall('(?m)\s+(\w+)',
"""
    sales@phptr.com
    postmaster@phptr.com
eng@phptr.com
noreply@phptr.com
"""
)
Out[62]: ['sales', 'postmaster', 'eng', 'noreply']

为什么第一、三次的空格和换行没有匹配,而第二次的匹配了?

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(4)
黄舟

findall优先返回分组的内容 (\w+)

没有分组,就返回整个表达式匹配的内容~ \s+

PHP中文网

(?m)s+(?!noreply|postmaster)(w+) 这个要求被匹配的字符串(空格与换行符)后面必须挨着noreply或者postmaster然后再跟着1个或多个单词(而非@这样的符号,@是不会被 w 匹配的)。

大家讲道理

我感觉问题应该出在 python 的 findall 函数中,比如你把第一个改成这样:

re.findall('(?m)\s+(?!noreply|postmaster)\w+',
"""
    sales@phptr.com
    postmaster@phptr.com
eng@phptr.com
noreply@phptr.com
"""
)

貌似空格就可以匹配了,你去找些 python findall 的原理看下吧

PHP中文网

zilong_thu的回答有误,(?!noreply|postmaster) 表示不匹配后面的内容才算匹配成功。第二个能匹配出空格是因为s匹配任何不可见字符,包括空格、制表符、换页符等等。等价于[ fnrtv]。而1和3没有是因为实际上返回是分组的内容即括号里的,如果有多个分组,就会被组成元组的形式,然后返回列表

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号