我有一个pandas df,其中一栏是等级为X / 10的文本。我想提取分子(可以是小数)。到目前为止,我正在使用:
my_df.text_column.str.extract('(\d*?\.?\d+(?=/10))')
我以为我还不错,直到我看到像.10
这样的分子。实际发生的情况是某些行的文本为:“ Nice job.10 / 10”。
在从此列中提取数字时,如果它检测到“。”,我该如何指定呢?一定是数字之后吗?
谢谢。
答案 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+
)。