|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
最近开始看鱼C的视频,在学习正则表达式的时候遇到一个问题
>>> import re
>>> a = "xaxbcdefgy"
>>> b = "xaxbcdefgyhy"
>>> c = "xayxbcy"
>>> re.search(r'x.+?y', a)
<_sre.SRE_Match object; span=(0, 10), match='xaxbcdefgy'>
>>> re.search(r'x.+?y', b)
<_sre.SRE_Match object; span=(0, 10), match='xaxbcdefgy'>
>>> re.search(r'x.+?y', c)
<_sre.SRE_Match object; span=(0, 3), match='xay'>
上面的a,b,c三个字符串,我都是想要匹配以x开头,以y结尾的最短字符串,也就是a和b是想匹配“xbcdefgy”这一段字符串,c想要匹配"xay"。
但是事实上,运行了以上代码进行测试的时候,就算用了非贪婪的状态,只有c的匹配是正确的,a和b左边x都匹配到了第一个x,这样的话请问应该怎样修改这一段代码?
不用修改了,你要的结果直接使用一次正则是实现不了的 ,你要找的是一个嵌套在匹配结果里的字符串,而正则匹配成功了就会直接跳过这段字符串,不会在这个已经匹配成功的字符串里去找新的匹配结果,想要实现这个功能,你就要自己实现了。比如:(仅供参考,随手写的,可能有bug 看不懂得就调试着一步一步看效果)
- def find_min_match(regex, str):
- match_results = re.findall(regex, str)
- matchs = list()
- result = list()
- for match_result in match_results:
- matchs.append(match_result)
- if len(match_result) > 1:
- matchs += find_min_match(regex, match_result[1:])
- for match in matchs:
- if result == list():
- result.append(match)
- elif len(result[0]) >len(match):
- result = [match]
- elif len(result[0]) == len(match):
- result.append(match)
- else:
- pass
- return result
复制代码
|
|