python - 取行中不带标签的数值,正则表达式

标签 python regex pandas

输入:

df=pd.DataFrame({'text':['value 123* 333','122* 666','722 888*']})
print(df)
             text
0  value 123* 333
1        122* 666
2        722 888*

我需要从df['text']中提取仅数值,但没有 *标签 我的代码:

df.text.str.extract(r'([0-9]+|[0-9]+\.[0-9]+)')

但是使用此代码,值带有 *返回右侧的字符。

预期输出:

text
333
666
722

最佳答案

您可以使用

df['text'].str.extract(r'(?=([0-9]+(?:\.[0-9]+)?))\1(?!\*)')

请参阅regex demo 。或者,您可能还需要在左侧使用 r'\b(?=([0-9]+(?:\.[0-9]+)?))\1(?!\*)'。请参阅this regex demo .

正则表达式详细信息

  • (?=([0-9]+(?:\.[0-9]+)?)) - 正向前瞻,需要并将以下序列捕获到组 1 中右边的图案:
    • [0-9]+ - 1+ 位数字
    • (?:\.[0-9]+)? - 可选的 . 序列和 1+ 位数字。
  • \1 - 第 1 组的值
  • (?!\*) - 如果紧邻右侧有一个 * 字符,则表示匹配失败的负向前瞻。

查看Python测试:

>>> import pandas as pd
>>> df=pd.DataFrame({'text':['value 123* 333','122* 666','722 888*']})
>>> df['text'].str.extract(r'(?=([0-9]+(?:\.[0-9]+)?))\1(?!\*)')
0    333
1    666
2    722
Name: text, dtype: object
>>> 

关于python - 取行中不带标签的数值,正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61013644/

相关文章:

Java:模式匹配器方法返回错误结果

regex - R 字符串来源

python - 在 DataFrame.groupby 的情况下,如何根据另一列的最大值获取列的值

Python pandas 函数根据另一行中的重复值将不同值连接到一列中

Python- Pandas : select first observation per group

python - 计算用户的帖子数量 - django

Python - 将包含实体引用的字符串显示为普通文本

java - @Path 和正则表达式 (Jersey/REST)

python - 检查 pandas dataframe 列中的特定值

python - Pandas to_sql() 不适用于 PostgreSQL - 对于类型字符不同的值太长