首页 > 解决方案 > 这个字符串的正则表达式?Python

问题描述

对于这个字符串:

London:Jan 48.0,Feb 38.9,Mar 39.9,Apr 42.2,May 47.3,Jun 52.1,Jul 59.5,Aug 57.2,Sep 55.4,Oct 62.0,Nov 59.0,Dec 52.9

我想找到所有这些数字。(而且只有数字)

我正在尝试这些:

re.findall('\s(.*),', string)
re.findall(' (.*),', string)
re.findall('\s++.+,', string)
re.findall('\s{2}.{1},', string)

但似乎没有任何效果。

标签: pythonregex

解决方案


让我们回顾一下您的四个初始模式并介绍它们的语法,然后我们可以考虑一些匹配您要匹配的字符串(即 00.0)的表达式。

审查模式

re.findall('\s(.*),', string)

此模式为:查找所有单个空白字符(\s)、除换行符(.*)和逗号(, ) 之外的任何字符的 0 次或多次重复。

这个模式很可能匹配整个字符串,因为重复限定符是贪婪的(即任何表达式字符 + * ? 将继续匹配返回匹配前一个表达式字符的任何字符。当我们在表达式中使用 '.*' ,它几乎总是会捕获整个字符串,因为它会贪婪地匹配所有不是换行符的字符。

re.findall(' (.*),', string)

与之前的模式相同的问题。

re.findall('\s++.+,', string)

我不认为 Python re 接受引用另一个重复限定符的重复限定符而不转义它。除非第一个 '+' 前面有一个 '\',否则使用 '++' 会失败,如下所示:'++'。但是,该表达式显示为:匹配一个或多个“+”字符('++)。表达式部分 '.+'匹配任何不是换行符('.+') 的字符的一个或多个重复,并成为贪婪问题的牺牲品。

re.findall('\s{2}.{1},', string)

波浪括号是允许输入重复范围的重复限定符。它们遵循语法“{m, n}”,其中 m 是最少的匹配项,而 n 是最多的。例如,模式AB{3, 4}不会匹配ABB,但会匹配ABBBor ABBBB

上面的模式看起来匹配:任何空白字符('\s{2}') 的 2 次重复,后跟任何一个不是换行符的字符('.{1}'),后跟逗号。

这里有几个不同的模式可供尝试——我也会谈到语法。

import re

p = ‘[0-9][0-9]\.[0-9]’
s = ‘ London:Jan 48.0,Feb 38.9,Mar 39.9,Apr 42.2,May 47.3,Jun 52.1,Jul 59.5,Aug 57.2,Sep 55.4,Oct 62.0,Nov 59.0,Dec 52.9’

if re.search(p, s):
    m = re.findall(p, s)

print(m)

请注意,除非您 100% 知道每个输入字符串都包含您要匹配的模式,否则在执行匹配之前测试字符串会很有帮助。我们可以测试字符串的一种方法是使用if子句检查匹配项的出现,re.search(p, s)其中 p 是某个模式的变量,s 是某个字符串的变量。

p = ‘[0-9][0-9]\.[0-9]’

此模式将匹配:一个数字 0-9 ('[0-9]') 后跟一个数字 0-9 ('[0-9]') 后跟一个句点('.')通过一个数字 0-9 ('[0-9]')。例如,此模式将匹配字符串19.9or40.0但不匹配40.or 40。字符串 '[0-9]' 使用方括号来标识正则表达式中的集合。使用一组,括号中包含的任何字符都可以匹配该位置。例如,[A5]将匹配Aor5但不匹配A5。就像其他文字字符一样,重复限定符适用于集合。所以我们也可以使用[A5]{1,2}to 来匹配A5

注意:这个表达式将句点注册为句点的原因是因为它前面有一个退格(即它从其特殊类中转义),因此它不再匹配“任何不是换行符的字符”。</p >

‘[0-9]{2}\.[0-9]{1}’ 

此模式与上述模式执行相同的操作,但使用大括号为重复次数设置一个常量(而不是像之前的模式那样重复两次)。

‘\d{2}\.\d{1}’

此模式使用特殊模式\d来匹配任何十进制数字(即任何数字)。它相当于[0-9]使用上面使用的集合。

值得注意的是,从技术上讲.不需要转义,因为句点字符 '.' 包含在“任何不是换行符的字符”的类中。但是,它使模式不那么健壮,因为它将(不准确地)匹配该位置不是换行符的任何字符。例如,它将匹配29.9or 29A9or 2909(因为它们在第三个位置都有一个非换行符。

希望这可以帮助!


推荐阅读