首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用lookhead/lookaround查找句子中的所有数字

使用lookhead/lookaround查找句子中的所有数字
EN

Stack Overflow用户
提问于 2014-12-18 05:47:43
回答 2查看 79关注 0票数 1

这是句子('Line#:‘不是句子的一部分):

代码语言:javascript
复制
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中构造一个正则表达式,以返回每行的所有数字:

代码语言:javascript
复制
Line 1 returns: [1, 100, 2, 4.567]
Line 2 returns: [11, 101, 21, 44.567]
Line 3 returns: [111, 102, 211, 444.567]

我想出的正则表达式如下:

代码语言:javascript
复制
(?<=Number )\d*

仅返回: 1,11,111

下面的代码不会返回任何内容:

代码语言:javascript
复制
(?<=Number )\d*(?<= is )\d*(?<=, number )\d*(?<= is )\d*

请帮帮忙。

EN

回答 2

Stack Overflow用户

发布于 2014-12-18 05:49:37

代码语言:javascript
复制
>>> s="Number 1 is 100, number 2 is 4.567"
>>> import re
>>> re.findall(r'\b[\d\.]+\b',s)
['1', '100', '2', '4.567']

对于转换为intfloat

代码语言:javascript
复制
>>> try :
...  map(int,re.findall(r'[\d\.]+',s))
... except:
...  map(float,re.findall(r'[\d\.]+',s))
... 
[1.0, 100.0, 2.0, 4.567]
票数 3
EN

Stack Overflow用户

发布于 2014-12-18 06:32:44

您的lookbehind (?<=Number )\d*适用于第一个数字,但是因为正则表达式匹配在默认情况下区分大小写,所以不匹配单词"number"后面的数字。要更改此行为,可以添加re.I标志以忽略大小写:

代码语言:javascript
复制
>>> s = "Number 1 is 100, number 2 is 4.567"
>>> re.findall(r"(?<=Number )\d+", s, re.I)
['1', '2']

如果你想在整个任务中使用后视断言,你可以这样做:

代码语言:javascript
复制
>>> re.findall(r"(?<=Number )\d+|(?<=Is )[\d\.]+", s, re.I)
['1', '100', '2', '4.567']

管道|的意思是" or ",所以我们匹配前面有"Number "的数字,或者前面有"Is "的数字(忽略字母的大小写)。

重要的一点是,后视需要固定宽度的断言:我们不能用(?<=Number |Is )之类的东西将表达式“简化”为一个后视断言,因为这两个词的长度不同。出于同样的原因,涉及+*等语法的表达式不能在lookbehinds中使用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27535431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档