RegEx用于提取十进制数字

时间:2019-05-10 18:54:55

标签: python regex pandas regex-group regex-greedy

我有一个pandas df,其中一栏是等级为X / 10的文本。我想提取分子(可以是小数)。到目前为止,我正在使用:

my_df.text_column.str.extract('(\d*?\.?\d+(?=/10))')

我以为我还不错,直到我看到像.10这样的分子。实际发生的情况是某些行的文本为:“ Nice job.10 / 10”。

在从此列中提取数字时,如果它检测到“。”,我该如何指定呢?一定是数字之后吗?

谢谢。

3 个答案:

答案 0 :(得分:2)

要做:

df.text.str.extract(r'(\d+\.?\d*?(?=/10))')

您要首先寻找一个数字(\d+),然后是一个可选的(\.?)和一个可选的小数(\d*?

示例:

df = pd.DataFrame({'text':["Nice Job.10/10", "Score 9.5/10", "And now 5./10"]})
df.text.str.extract(r'(\d+\.?\d*?(?=/10))')



    0
0   10
1   9.5
2   5.

答案 1 :(得分:2)

最简单的方法(\d+(?:\.\d*)?(?=/10))


样本

Nice job.10/10".
 "0.10/10", then it would be "0.10" 

基准

Regex1:   (\d+(?:\.\d*)?(?=/10))
Completed iterations:   50  /  50     ( x 1000 )
Matches found per iteration:   2
Elapsed Time:    1.04 s,   1038.38 ms,   1038383 µs
Matches per sec:   96,303

答案 2 :(得分:1)

我将分子模式分为两种情况:一种为“。”。还有一个不带“。”。

  • 带“。”的分子:\d+\.\d+
  • 不带“。”的分子:\d+

因此,分子的模式将为(\d+\.\d+|\d+)。 将所有内容放在一起,我们得到(\d+\.\d+|\d+)/\d+

如果正则表达式引擎不优先考虑更长的匹配项,则两部分的顺序很重要。将较长的选择放在第一位将为您提供最长的匹配。如果分子是十进制数,则选择整个分子(\d+\.\d+),而不仅仅是十进制部分(\d+)。