【问题标题】:How to only capture first group in regex? [duplicate]如何只捕获正则表达式中的第一组? [复制]
【发布时间】:2018-05-24 16:31:14
【问题描述】:

这是我所指的文字:

'    High  4:55AM 1.3m   Low 11:35AM 0.34m   High  5:47PM 1.12m   Low 11:40PM 0.47m       First Light  5:59AM   Sunrise  6:24AM   Sunset  5:01PM   Last Light  5:27PM    '

使用 Python 和正则表达式,我只想捕获:“High 4:55AM 1.3m Low 11:35AM 0.34”(这是文本的第一部分,理想情况下我想在没有额外空格的情况下捕获它)。

到目前为止,我已经尝试过这个正则表达式:.{44}

它设法捕获了我想要的文本组,即前 44 个字符,但它也捕获了我不想要的后续 44 个字符组。

【问题讨论】:

  • 你需要去掉 g(全局)标志
  • 如果您只想要前 44 个字符,只需使用索引:您不需要正则表达式。
  • 请写下你正在使用的代码。

标签: python regex


【解决方案1】:

如果您真的只需要前 44 个字符,则不需要正则表达式:您可以简单地使用 Python 字符串切片运算符:

first_44_characters = s[:44]

但是,正则表达式的功能要强大得多,并且可以解释您感兴趣的部分的长度可能会发生变化的事实。例如,如果时间是上午 10 点而不是上午 4 点,则该部分的长度可能会改变(或者可能不会,也许这就是空间填充的用途?)。在这种情况下,您可以使用这样的正则表达式来捕获它:

>>> re.match(r'\s+(High.*?)m', s).group(1)
'High  4:55AM 1.3'

\s 匹配任何空白字符,+ 匹配前面的一个或多个元素,括号定义以 High 开头并包含任何字符的最小长度序列的组,括号后面的 m表示该组在小写 m 字符之前结束。

如果需要,您还可以使用正则表达式提取序列的各个部分:

>>> re.match(r'\s+(High)\s+(\d+\:\d+)(AM|PM)\s+(\d+\.\d+)m', s).groups()
('High', '4:55', 'AM', '1.3')

【讨论】:

    【解决方案2】:

    此正则表达式将捕获从第一个 "High" 开始直到下一个 "High"(不包括)的所有内容,如果没有下一个,则捕获字符串的结尾。它消除了catured组开头和结尾的多余空格。

    ^\s*(High.*?)\s*(?=$|High)
    

    如果您想在捕获的组中将所有多个空格减少为单个空格,您可以使用替换功能,然后将此正则表达式 " +" 替换为 " "

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-28
      • 2014-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-13
      • 2011-03-11
      • 2017-01-07
      相关资源
      最近更新 更多