def myregex(pattern,text,dir=0):
import re
m = re.search(pattern, text)
if m:
yield m.group(0)
if len(m.group('suffix')):
for r in myregex(pattern, "%s%s%s" % (m.group('prefix'),m.group('suffix')[1:],m.group('end')),1):
yield r
if dir<1 :
for r in myregex(pattern, "%s%s%s" % (m.group('prefix'),m.group('suffix')[:-1],m.group('end')),-1):
yield r
def myprocess(pattern, text):
parts = pattern.split("*")
for i in range(0, len(parts)-1 ):
res=""
for j in range(0, len(parts) ):
if j==0:
res+="(?P<prefix>"
if j==i:
res+=")(?P<suffix>"
res+=parts[j]
if j==i+1:
res+=")(?P<end>"
if j<len(parts)-1:
if j==i:
res+=".*"
else:
res+=".*?"
else:
res+=")"
for r in myregex(res,text):
yield r
def mycount(pattern, text):
return set(myprocess(pattern, text))
2 回答
是的,这是丑陋的,未经优化但似乎有效 . 这是对所有可能的 but unique 变体的简单尝试
测试:
我认为你正在寻找的东西最好用一个像lepl这样的解析库来完成:
我相信
parser.parse_all
的输出长度是你正在寻找的 .请注意,如果模式与整个字符串不匹配,则需要使用
parser.config.no_full_first_match()
来避免错误 .编辑:根据@ Shamanu4的评论,我看到你想从任何位置开始匹配结果,你可以这样做: