python - 有关正则表达式的问题
大家讲道理
大家讲道理 2017-04-18 10:13:03
0
4
227
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+

Ty80

(?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 的原理看下吧

Ty80

zilong_thu的回答有誤,(?!noreply|postmaster) 表示不符後面的內容才算匹配成功。第二個能匹配出空格是因為s匹配任何不可見字符,包括空格、製表符、換頁符等等。等價於[ fnrtv]。而1和3沒有是因為實際上返回是分組的內容即括號裡的,如果有多個分組,就會被組成元組的形式,然後返回列表

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板