正则表达式 findall 的数字

Posted

技术标签:

【中文标题】正则表达式 findall 的数字【英文标题】:regex findall for numbers 【发布时间】:2018-06-10 20:28:02 【问题描述】:

我正在尝试提取文本中嵌入的 6 位数字。数字总是以零开头,总是有 6 位数字,在第 4 位数字之后用句点分隔,如下所示:

0 0133.02[text] in location [texttext](text) numbers 1 0121.08[text] in location [texttext](text) numbers ...

我运行以下命令:

import re filtered = re.findall("0\d\d\d[.]\d\d", str(df['col']))

有478行需要解析,每行包含上述数字。但是,filtered 结果只输出 60,即使我更改了正则表达式格式。有趣的是,filtered 似乎主要由 478 行中第一行和最后几行的数字组成,而不是中间的数字?

编辑: 我提取了有效与无效的行,发现有效的行是前 30 行和后 30 行(0-29、448-477)。

以下是无效行的示例(446、447): 446 0005.00 [CT] in Vancouver [CMA] (B.C.) 44160 447 0170.05 [CT] in Vancouver [CMA] (B.C.) 44006

还有一个有效的行示例(448、449): 448 0050.04 [CT] in Vancouver [CMA] (B.C.) 43995 449 0067.01 [CT] in Vancouver [CMA] (B.C.) 43989

【问题讨论】:

不看数据就很难看出哪里出了问题。您的正则表达式应该可以工作。 您的问题与这个有关吗? ***.com/questions/15325182/… 尝试'\d+\.?\d*' 并查看结果数。可能您的某些元素与您的预期格式不匹配 您需要共享更多数据才能使其正常工作。我们无法猜测出了什么问题。提取不起作用的行怎么样? 【参考方案1】:

这些可以帮助您解决这个问题。我将删除它,因为它不是答案。

import re
import pandas as pd

data = dict(col=['texttexttext 0036.01 texttext','texttexttext 0006.21 texttext'])
df = pd.DataFrame(data)

re.findall("0\d3\.\d2", str(df['col'])) #Simplified your regex

有效地创造:

['0036.01', '0006.21']

试试这个怎么样:

re.findall("0\d3\.\d2",' '.join(df['col'].tolist()))

如果中间行不起作用,请提取样本,例如,并与我们分享:

print('\n'.join(df['col'][200:220].tolist()))

【讨论】:

感谢您的建议,我编辑了帖子以包含无效行的示例 @eh2699 奇怪.. 如果你改为使用 ' '.join() 函数会怎样? 成功了!!对不起,我是 python 新手,你能花点时间吗? - join() 做了什么来使它工作而不使用那个没有? @eh2699 tbh 这更像是一个猜测。 str.join() 将字符串列表粘合到一个长字符串中。我的猜测是 str(df['col']) 没有返回所有值。

以上是关于正则表达式 findall 的数字的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 整理

D21_1.1_正则表达式_单个字符匹配

正则表达式:匹配单个数字重复n次

正则表达式如何提取中间的数字?

正则表达式re模块

常用模块之正则表达式模块