python - 这个字符串的正则表达式?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)
但似乎没有任何效果。
解决方案
让我们回顾一下您的四个初始模式并介绍它们的语法,然后我们可以考虑一些匹配您要匹配的字符串(即 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
,但会匹配ABBB
or 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.9
or40.0
但不匹配40.
or 40
。字符串 '[0-9]' 使用方括号来标识正则表达式中的集合。使用一组,括号中包含的任何字符都可以匹配该位置。例如,[A5]
将匹配A
or5
但不匹配A5
。就像其他文字字符一样,重复限定符适用于集合。所以我们也可以使用[A5]{1,2}
to 来匹配A5
。
注意:这个表达式将句点注册为句点的原因是因为它前面有一个退格(即它从其特殊类中转义),因此它不再匹配“任何不是换行符的字符”。</p >
‘[0-9]{2}\.[0-9]{1}’
此模式与上述模式执行相同的操作,但使用大括号为重复次数设置一个常量(而不是像之前的模式那样重复两次)。
‘\d{2}\.\d{1}’
此模式使用特殊模式\d
来匹配任何十进制数字(即任何数字)。它相当于[0-9]
使用上面使用的集合。
值得注意的是,从技术上讲,.
不需要转义,因为句点字符 '.' 包含在“任何不是换行符的字符”的类中。但是,它使模式不那么健壮,因为它将(不准确地)匹配该位置不是换行符的任何字符。例如,它将匹配29.9
or 29A9
or 2909
(因为它们在第三个位置都有一个非换行符。
希望这可以帮助!
推荐阅读
- java - 动态地将值传递给泛型方法
- c - 使用 struct 作为“数据库”的任意数量单词(字母顺序)的排序算法
- ruby - 如何防止类在 Ruby 中被覆盖?
- linux - pubsubbeat 与 elasticsearch 的集成
- scala - sbt assembly with Junit test fail
- python - 为什么“B”代码没有打印所需的范围?
- cookies - 为什么 cookie 没有在来自子域的请求中传递?
- bash - 如何使用带有awk的match()函数中的变量定义范围'r(n,)'
- angular - 在 Angular .subscribe() 函数中更改关联变量后,HTML 组件未触发
- .net - 在 C# 中,将文件(xml)提交到服务器后,得到具有一些边界标头的响应 XML