这是句子('Line#:‘不是句子的一部分):
Line1: Number 1 is 100, number 2 is 4.567
Line2: Number 11 is 101, number 21 is 44.567
Line3: Number 111 is 102, number 211 is 444.567我想在python中构造一个正则表达式,以返回每行的所有数字:
Line 1 returns: [1, 100, 2, 4.567]
Line 2 returns: [11, 101, 21, 44.567]
Line 3 returns: [111, 102, 211, 444.567]我想出的正则表达式如下:
(?<=Number )\d*仅返回: 1,11,111
下面的代码不会返回任何内容:
(?<=Number )\d*(?<= is )\d*(?<=, number )\d*(?<= is )\d*请帮帮忙。
发布于 2014-12-18 05:49:37
>>> s="Number 1 is 100, number 2 is 4.567"
>>> import re
>>> re.findall(r'\b[\d\.]+\b',s)
['1', '100', '2', '4.567']对于转换为int和float:
>>> try :
... map(int,re.findall(r'[\d\.]+',s))
... except:
... map(float,re.findall(r'[\d\.]+',s))
...
[1.0, 100.0, 2.0, 4.567]发布于 2014-12-18 06:32:44
您的lookbehind (?<=Number )\d*适用于第一个数字,但是因为正则表达式匹配在默认情况下区分大小写,所以不匹配单词"number"后面的数字。要更改此行为,可以添加re.I标志以忽略大小写:
>>> s = "Number 1 is 100, number 2 is 4.567"
>>> re.findall(r"(?<=Number )\d+", s, re.I)
['1', '2']如果你想在整个任务中使用后视断言,你可以这样做:
>>> re.findall(r"(?<=Number )\d+|(?<=Is )[\d\.]+", s, re.I)
['1', '100', '2', '4.567']管道|的意思是" or ",所以我们匹配前面有"Number "的数字,或者前面有"Is "的数字(忽略字母的大小写)。
重要的一点是,后视需要固定宽度的断言:我们不能用(?<=Number |Is )之类的东西将表达式“简化”为一个后视断言,因为这两个词的长度不同。出于同样的原因,涉及+或*等语法的表达式不能在lookbehinds中使用。
https://stackoverflow.com/questions/27535431
复制相似问题