elerabbit 发表于 2018-6-28 01:00:23

Python正则表达式学习中遇到的问题

最近开始看鱼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 07:05:18

正则并非万能,它没有统计计算的功能,只能按照共性特征进行匹配。什么最长最短的要求,在特殊的条件下可能会达到,但往往不具备通用性。就你例子的这三行来说,第一二行达成最短的x到y的匹配是可以做到的,但是加上第三行后,我认为是不太可能三行都做到的,因为它们的关键特征相互矛盾。

火垂るの墓 发表于 2018-6-28 08:48:47

不用修改了,你要的结果直接使用一次正则是实现不了的{:10_256:},你要找的是一个嵌套在匹配结果里的字符串,而正则匹配成功了就会直接跳过这段字符串,不会在这个已经匹配成功的字符串里去找新的匹配结果,想要实现这个功能,你就要自己实现了。比如:(仅供参考,随手写的,可能有bug{:10_304:}看不懂得就调试着一步一步看效果)
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)
    for match in matchs:
      if result == list():
            result.append(match)
      elif len(result) >len(match):
            result =
      elif len(result) == len(match):
            result.append(match)
      else:
            pass
    return result

老猫NAKE 发表于 2018-6-28 09:15:28

re.search(r'xb.+?y', a)
re.search(r'xb.+?y', y)
?

elerabbit 发表于 2018-6-28 10:24:21

谢谢上面的各位大佬指导 这方面了解了。

eq12315 发表于 2018-6-28 12:33:27

{:10_249:}不错。

eq12315 发表于 2018-6-28 13:50:54

不错。。
页: [1]
查看完整版本: Python正则表达式学习中遇到的问题