Python:在之前或之后不贪婪

Python:在之前或之后不贪婪,python,extract,greedy,non-greedy,Python,Extract,Greedy,Non Greedy,我做了一些测试来帮助自己理解Python中的非贪婪,但这让我比以前更加困惑。谢谢你的帮助 结果: ['000@hhhaaa@stephen.marquard@uct.ac.za@bbb@c', 'fff@d'] # 1 ['000@hhhaaa@stephen.marquard@uct.ac.za@bbb@ccc', 'fff@ddd'] # 2 ['000@h', 'hhaaa@s', 'tephen.marquard@u', '

我做了一些测试来帮助自己理解Python中的非贪婪,但这让我比以前更加困惑。谢谢你的帮助

结果:

['000@hhhaaa@stephen.marquard@uct.ac.za@bbb@c', 'fff@d']                   # 1
['000@hhhaaa@stephen.marquard@uct.ac.za@bbb@ccc', 'fff@ddd']               # 2
['000@h', 'hhaaa@s', 'tephen.marquard@u', 'ct.ac.za@b', 'bb@c', 'fff@d']   # 3
['000@hhhaaa@stephen.marquard@uct.ac.za@bbb@ccc', 'fff@ddd']               # 4
问题:

  • 为什么这里的结果只显示一个d-@d
  • 很正常,很清楚
  • 非常困惑,我甚至不知道如何问背后的逻辑。。。尤其是与1相比
  • 看起来和2一样,为什么?之前@是如此的“软弱”
  • 为什么这里的结果只显示一个d-@d
  • 因为
    +?
    不需要多次匹配,所以它不需要

  • 很正常,很清楚
  • 非常困惑,我甚至不知道如何问背后的逻辑。。。尤其是与1相比
  • 同样,
    +?
    匹配尽可能多的字符,而不是尽可能多的字符,这正是贪婪匹配和非贪婪匹配之间的区别

    \S+?@\S+?
    匹配
    的示例中000@hhhaaa@斯蒂芬。marquard@uct.ac.za@bbb@ccc

    • 它与中的
      匹配,但由于存在空格,因此失败
    • 它匹配
      000
      ,然后
      @
      匹配,然后
      \S+?
      再次匹配它必须匹配的
      \S
      。它必须
      匹配一个字符
    • 整体匹配为
      000@h
  • 看起来和2一样,为什么?之前@是如此的“软弱”
  • 如上所述



    既然电子邮件地址不能包含空格,为什么还要麻烦非贪婪匹配呢?您可以使用像
    \S++\S++

    这样简单的方法,由于
    +
    的原因,懒惰的
    \S+?
    必须至少匹配一个字符。如果模式后面没有任何内容,它将只匹配一个字符,因为它是惰性的。如果有一个
    @
    ,它将匹配尽可能少的字符,直到它匹配第一次出现的
    @
    ,也许这个页面会有所帮助@ShoubhikRMaiti我相信python的re模块与使用regex的任何其他软件具有相同的行为。这是完全错误的。正则表达式有多种方言。即使Python也支持两种(
    re
    regex
    )。但是,所有支持非贪婪匹配的regex方言对于这里提出的问题都是完全相同的。非常感谢您的详细解释!我只是研究了非贪婪部分,所以我想做一些测试,看看我是否理解清楚。幸运的是我做了这些测试!现在我明白了!我还以为Python会从@到左手边阅读之前的部分@,事实上我现在意识到Python是从左到右阅读的!!!谢谢
    ['000@hhhaaa@stephen.marquard@uct.ac.za@bbb@c', 'fff@d']                   # 1
    ['000@hhhaaa@stephen.marquard@uct.ac.za@bbb@ccc', 'fff@ddd']               # 2
    ['000@h', 'hhaaa@s', 'tephen.marquard@u', 'ct.ac.za@b', 'bb@c', 'fff@d']   # 3
    ['000@hhhaaa@stephen.marquard@uct.ac.za@bbb@ccc', 'fff@ddd']               # 4