【问题标题】:regex duplicate matching? nested groups?正则表达式重复匹配?嵌套组?
【发布时间】:2021-07-01 04:49:45
【问题描述】:

这个例子来自一本书。 电子邮件正则表达式如下所示:

emailRegex = re.compile(r'''(
        [a-zA-Z0-9._%+-]+               #username
        @                               #@ symbol
        [a-zA-Z-0-9.-]+                 #domain name
        (\.[a-zA-Z]{2,5})               #dot-something
        )''', re.VERBOSE)

匹配[a-zA-Z0-9._%+-] 的一次或多次出现,然后是@,然后是[a-zA-Z-0-9.-] 的一次或多次出现,然后是一个点,以及[a-zA-Z] 中的 2 到 5 个字符。

>>> emailRegex.findall('my email: stackoverflow@flow.com Please reach me here.')
[('stackoverflow@flow.com', '.com')]

'.com' 如何包含在内? .com 已经与[a-zA-Z-0-9.-]+ 匹配,然后又与(\.[a-zA-Z]{2,5}) 匹配?这是如何运作的?我认为这与 emailRegex 具有嵌套组的事实有关,但我不熟悉它是如何工作的。

【问题讨论】:

    标签: python regex


    【解决方案1】:

    “点某物”周围的模式中有一组额外的括号。除了基本模式之外,每组裸括号都成为一个“匹配组”。如果你不想要这个组,你可以省略那些额外的括号。

    【讨论】:

    • 我知道这一点,但我对#domain name 和#dot-something 之间发生的事情感到困惑。 '.com' 已经被匹配了,那么这个额外的'.com' 是如何再次匹配的呢?
    • 回溯。如果“#domain name”部分匹配flow.com,则“#dot-something”部分将没有任何内容,因此匹配将失败。因此,它会备份并重试,直到域被分成两部分。
    • 不完全是。只有一场比赛,但因为它有两组,所以分别呈现。如findall() docs 中所述:“如果模式中存在一个或多个组,则返回组列表;如果模式有多个,这将是元组列表组。” @lizardowl5151 在this demo 中很容易看到。删除多余的() 看看会发生什么
    【解决方案2】:

    (email(.com)) 正则表达式中最左边的( 是组(1),最左边的( 组(2)等等。 (string(also string))。 'string also string' 是组 (1)。 also string 是组(2)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      • 1970-01-01
      • 2020-04-09
      • 2014-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多