这个字符串的正则表达式?python

这个字符串的正则表达式?python,python,regex,Python,Regex,对于此字符串: 伦敦:一月48.0日、二月38.9日、三月39.9日、四月42.2日、五月47.3日、六月52.1日、七月59.5日、八月57.2日、九月55.4日、十月62.0日、十一月59.0日、十二月52.9日 我想找到所有这些号码。(仅限数字) 我正在尝试这些: re.findall('\s(.*),', string) re.findall(' (.*),', string) re.findall('\s++.+,', string) re.findall('\s{2}.{1},',

对于此字符串:

伦敦:一月48.0日、二月38.9日、三月39.9日、四月42.2日、五月47.3日、六月52.1日、七月59.5日、八月57.2日、九月55.4日、十月62.0日、十一月59.0日、十二月52.9日

我想找到所有这些号码。(仅限数字)

我正在尝试这些:

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

但是似乎什么都不管用。

re.findall(r'\d+[.]?\d*',string)
让我明白了
['48.0','38.9','39.9','42.2','47.3','52.1','59.5','57.2','55.4','62.0','59.0','52.9']

<

>>> re.findall(r'[\d.]+', nums)
['48.0', '38.9', '39.9', '42.2', '47.3', '52.1', '59.5', '57.2', '55.4', '62.0', '59.0', '52.9']
如果“所有这些数字”仅指整数(即句点是分隔符而不是小数点),则更容易:

>>> re.findall(r'\d+', nums)
['48', '0', '38', '9', '39', '9', '42', '2', '47', '3', '52', '1', '59', '5', '57', '2', '55', '4', '62', '0', '59', '0', '52', '9']

让我们回顾一下你的四个初始模式并覆盖它们的语法,然后我们可以考虑一些与你要匹配的字符串匹配的表达式(即0)。 查看模式

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

此模式很可能匹配整个字符串,因为重复限定符是贪婪的(也就是说,任何表达式字符+*?都将继续匹配返回上一个表达式字符匹配的任何字符。当我们在表达式中使用“.*”时,它几乎总是捕获整个字符串,因为它将贪婪地匹配所有非换行符的字符

re.findall(' (.*),', string)
与前一个模式相同的问题

re.findall('\s++.+,', string)
‘\d{2}\.\d{1}’
我认为Python不会在不转义的情况下重新接受引用另一个重复限定符的重复限定符。除非第一个“+”前面有这样的“\”:“++”,否则使用“++”将失败。但是,该表达式的内容为:匹配一个或多个“+”字符(“++”)。表达式部分“+”匹配任何非换行符(“.+”)的字符的一个或多个重复,并成为贪婪问题的牺牲品

re.findall('\s{2}.{1},', string)
波形括号是允许输入一系列重复的重复限定符。它们遵循语法“{m,n}”,其中m是最少的匹配项,n是最多的。例如,模式
AB{3,4}
将不匹配
ABB
,但它将匹配
ABBB
ABBB

上面的模式看起来是匹配的:任何空白字符('\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
40.0
,但不匹配
40。
40
。字符串“[0-9]”使用括号来标识正则表达式中的集合。对于集合,括号中包含的任何字符都可以与该点匹配。例如,
[A5]
将匹配
A
5
,但不匹配
A5
。就像其他文字字符一样,重复限定符将在集合上工作。因此,我们可以使用
[A5]{1,2}
也匹配
A5

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

‘[0-9]{2}\.[0-9]{1}’ 
此模式的作用与上面相同,但使用花括号设置重复次数的常量(而不是像前面的模式一样重复设置两次)

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

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

希望这有帮助!

使用:

import re

str = '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'
num_arr = re.findall(r'\d+(?:\.\d+)?', str)
print num_arr
输出:

['48.0', '38.9', '39.9', '42.2', '47.3', '52.1', '59.5', '57.2', '55.4', '62.0', '59.0', '52.9']

我想你知道
\s
是一个空格字符。数字也有类似的
\d
。你试过进一步研究吗?它工作得很好,谢谢!尽管如此,你能详细说明它是如何工作的吗?
\d
只是指任何数字,所以它会寻找一个或多个数字,然后是一个可选的句点,然后是0或更多的数字在那之后。我也不认为这有什么关系,但有一个问题是你没有逃逸正则表达式,所以如果你碰巧在python解释为特殊字符的反斜杠后面有一个字母,那就行不通了。这就是为什么我在字符串前面有r。方括号定义了一个“字符类”。
[\d.]
的意思是“任何数字(
\d
)或文字句点(
)”后面的
+
表示“至少有一个,但可能更多”。非常感谢您的精心设计,它真的很有帮助!:-)太棒了,很高兴它有帮助!