当我运行此代码时,它既不打印'checked'
也不打印'not matching'
。它完全停止响应。
url='http://hoswifi.bblink.cn/v3/2-fd1cc0657845832e5e1248e6539a50fa/topic/55-13950.html?from=home'
m=re.search(r'/\d-(B|(\w+){10,64})/index.html',url)
if m:
print('checked')
else:
print('not matching')
答案 0 :(得分:2)
假设我们有以下脚本:
s = '1234567890'
m = re.search(r'(\w+)*z', s)
我们的字符串包含10位数字,但不包含'z'
。这是故意的,因此强制re.search
检查所有可能的组合,否则它将在第一场比赛时停止。
我无法计算可能组合的数量,因为所涉及的数学相当棘手,但这里有一个小型演示,说明当s
获得更多数字时会发生什么:
对于单个数字s
,时间从大约1μs到30位数s
的100秒,即10 8 更多时间。
我的猜测是当你使用(\w+){10,64}
时会发生类似的事情。相反,您应该使用\w{10,64}
。
用于演示的代码:
import timeit
import matplotlib.pyplot as plt
setup = """
import re
"""
_base_stmt = "m = re.search(r'(\w+)*z','{}')"
# (searched string becomes '1', '11', '111'...)
statements = {}
for i in range(1, 18):
statements.update({i: _base_stmt.format('1'*i)})
# Creates x, y values
x = []
y = []
for i in sorted(statements):
x.append(i)
y.append(timeit.timeit(statements[i], setup, number=1))
# Plot
plt.plot(x, y)
plt.xlabel('string length')
plt.ylabel('time(sec)')
plt.show()
答案 1 :(得分:-1)
这是对的。
' \ w + {10,64}'错了,\ w +不应该用' +'
url='http://hoswifi.bblink.cn/v3/2-fd1cc0657845832e5e1248e6539a50fa/topic/55-13950.html?from=home'
m=re.search(r'/\d-(B|\w{10,64})/index.html',url)
if m:
print('checked')
else:
print('not matching')