用于提取十进制数的正则表达式

RegEx for extracting a decimal number

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

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

我以为我做得很好,直到我看到我有一些像 .10 这样的分子。实际发生的情况是有些行的文本如下:"Nice job.10/10".

从该列中提取数字时如何指定,以防它检测到“.”它一定是在一个数字之后?

谢谢。

做:

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.

我会将分子模式分为两种情况:一种带有“.”。一个没有“.”。

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

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

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

最简单的方法(\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