Crossin的编程教室

标题: 正则表达式疑问 [打印本页]

作者: 772546116    时间: 2019-3-12 21:20
标题: 正则表达式疑问
import re
text='Let us go go go !'
m=re.findall('(go\s*)+',text)
if m:
    print m
else:
    print 'not match'

>>>
['go ']

为什么结果不是go go go  .+使用的不是贪婪准则吗


作者: crossin先生    时间: 2019-3-12 21:32
匹配到的是 'go go go '
但你还加了括号,那么就只捕获分组,你的分组是 go\s*,也就是 'go '
作者: stormsha    时间: 2019-3-13 13:11
本帖最后由 stormsha 于 2019-3-13 13:13 编辑

import re

# 1
"""
. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
.+  加上 + 匹配一个或多个,贪婪匹配
.*  加上 * 匹配零个或多个,贪婪匹配

.+?  .*?  加上 ? 非贪婪匹配
"""
print(1, '---------------------------------------')
# 实战检测一下更好理解
text = 'Let us go go go !'
m1 = re.findall('us (.+) !', text)
m2 = re.findall('(go.+) ', text)
m3 = re.findall('(go.*) ', text)
print(m1)
print(m2)
print(m3)

# 2
"""
# \d    匹配任意数字,等价于 [0-9].
\d+     
\d+?    这里 + 、?、+? 和上边意义是一样的,只不过匹配的目标是 \d (数字)
"""

# 实战检测一下更好理解
print(2, '---------------------------------------')
text = 'Let us 3 4  5 52 go go go !'
m1 = re.findall('(\d+?)', text)
m2 = re.findall('(\d+)', text)
m3 = re.findall('(5\d*?)', text)
print(m1)
print(m2)
print(m3)


# 3
"""
\s 匹配任意空白字符,等价于 [\t\n\r\f].

\s*
\s*?

从上边可以发现,  *、*?和上边意义也一样,只是这里\s匹配空字符

"""
print(3, '---------------------------------------')
text = 'Let us go go go !'
m1 = re.findall(r'go\s+', text)
m2 = re.findall(r'go\s+?', text)
m3 = re.findall(r'go\s*?', text)

m4 = re.findall(r'(go\s*)', text)
m5 = re.findall(r'(go\s*)+', text)

m6 = re.findall(r'(go\s*?)', text)
m7 = re.findall(r'(go\s*?)+', text)

m8 = re.findall(r'(go go go\s*)', text)

print(m1)
print(m2)
print(m3)
print(m4)
print(m5)
print(m6)
print(m7)
print(m8)

"""
看到了这个问题,自己写了一下加深一下对 .  \d  \s  的理解
"""
作者: crossin先生    时间: 2019-3-13 15:03
stormsha 发表于 2019-3-13 13:11
import re

# 1

很好的习惯




欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5