如何只捕获正则表达式中的第一组?

时间:2018-05-24 08:15:22

标签: python regex

这是我所指的文字:

'    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和正则表达式,我只想捕获:“高4:55 AM 1.3m低11:35 AM 0.34”(这是文本的第一部分,理想情况下我想在没有多余空格的情况下捕获它)。

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

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

2 个答案:

答案 0 :(得分:0)

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

first_44_characters = s[:44]

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

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

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

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

m

答案 1 :(得分:0)

这个正则表达式将捕获从第一个def postMultipartForm(String uri, File file, String filePartName, Map<String, String> textFields = [:], Map<String, String> httpHeaders = [:]) { MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create() .addPart(filePartName, new FileBody(file, ContentType.APPLICATION_XML.withCharset(StandardCharsets.UTF_8))) textFields.each { n, v -> entityBuilder.addTextBody(n, v) } final expectedResponseContentType = ContentType.ANY return new HTTPBuilder().request(uri, Method.POST, expectedResponseContentType) { HttpEntityEnclosingRequest req -> req.entity = entityBuilder.build() httpHeaders.each { h, v -> req.addHeader(h, v) } } } 开始直到下一个"High"(未包括)的所有内容,或者如果没有下一个,则捕获字符串的结尾。它消除了被攻击组开始和结束时的额外空间。

"High"

如果要将所有多个空格减少到捕获的组内的单个空格,可以使用替换函数,然后将此正则表达式^\s*(High.*?)\s*(?=$|High) 替换为" +"