鱼C论坛

 找回密码
 立即注册
查看: 2087|回复: 6

[已解决]Python正则表达式学习中遇到的问题

[复制链接]
发表于 2018-6-28 01:00:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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,这样的话请问应该怎样修改这一段代码?
最佳答案
2018-6-28 08:48:47
不用修改了,你要的结果直接使用一次正则是实现不了的,你要找的是一个嵌套在匹配结果里的字符串,而正则匹配成功了就会直接跳过这段字符串,不会在这个已经匹配成功的字符串里去找新的匹配结果,想要实现这个功能,你就要自己实现了。比如:(仅供参考,随手写的,可能有bug看不懂得就调试着一步一步看效果)
  1. def find_min_match(regex, str):
  2.     match_results = re.findall(regex, str)
  3.     matchs = list()
  4.     result = list()
  5.     for match_result in match_results:
  6.         matchs.append(match_result)
  7.         if len(match_result) > 1:
  8.             matchs += find_min_match(regex, match_result[1:])
  9.     for match in matchs:
  10.         if result == list():
  11.             result.append(match)
  12.         elif len(result[0]) >len(match):
  13.             result = [match]
  14.         elif len(result[0]) == len(match):
  15.             result.append(match)
  16.         else:
  17.             pass
  18.     return result
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-6-28 07:05:18 | 显示全部楼层
正则并非万能,它没有统计计算的功能,只能按照共性特征进行匹配。什么最长最短的要求,在特殊的条件下可能会达到,但往往不具备通用性。就你例子的这三行来说,第一二行达成最短的x到y的匹配是可以做到的,但是加上第三行后,我认为是不太可能三行都做到的,因为它们的关键特征相互矛盾。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-28 08:48:47 | 显示全部楼层    本楼为最佳答案   
不用修改了,你要的结果直接使用一次正则是实现不了的,你要找的是一个嵌套在匹配结果里的字符串,而正则匹配成功了就会直接跳过这段字符串,不会在这个已经匹配成功的字符串里去找新的匹配结果,想要实现这个功能,你就要自己实现了。比如:(仅供参考,随手写的,可能有bug看不懂得就调试着一步一步看效果)
  1. def find_min_match(regex, str):
  2.     match_results = re.findall(regex, str)
  3.     matchs = list()
  4.     result = list()
  5.     for match_result in match_results:
  6.         matchs.append(match_result)
  7.         if len(match_result) > 1:
  8.             matchs += find_min_match(regex, match_result[1:])
  9.     for match in matchs:
  10.         if result == list():
  11.             result.append(match)
  12.         elif len(result[0]) >len(match):
  13.             result = [match]
  14.         elif len(result[0]) == len(match):
  15.             result.append(match)
  16.         else:
  17.             pass
  18.     return result
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-28 09:15:28 | 显示全部楼层
re.search(r'xb.+?y', a)
re.search(r'xb.+?y', y)
?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-28 10:24:21 | 显示全部楼层
谢谢上面的各位大佬指导 这方面了解了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-28 12:33:27 | 显示全部楼层
不错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-6-28 13:50:54 From FishC Mobile | 显示全部楼层
不错。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-1 12:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表