python - 在特定条件下从字符串中提取数字

标签 python regex pandas

我有一些字符串存储在使用 pandas 的数据框中,如果存在,我想从中提取所有数字。这些数字必须满足的条件非常具体,我不确定是否可以使用正则表达式来解决我的问题。条件是:

  • 数字不能在字符串的开头
  • 它不能出现在“No.”或“Question”之后

此外,如果可能的话,如果数字后面有一个 e,我也想保留它。然而,这并不重要。

这是我到目前为止找到的所有数字,但我不知道如何编码我上面提到的条件。

testNumbers = re.findall(r'\d+', row['Name'])

对于给定的字符串:“Test T860 Article No. 9712250 787”

我希望正则表达式返回

[860, 787]

最佳答案

你可以使用

(?!^)(?<!\d)(?<!\bNo\.\s)(?<!\bQuestion\s)(\d+)(?!\d)

在 Python 中,声明为原始字符串文字:

pattern = r'(?!^)(?<!\d)(?<!\bNo\.\s)(?<!\bQuestion\s)(\d+)(?!\d)'

参见 regex demo

详情

  • (?!^) - 不在字符串的开头
  • (?<!\d) - 不允许紧接当前位置之前的数字
  • (?<!\bNo\.\s) - 没有No.并且允许紧接在前面的空格
  • (?<!\bQuestion\s) - 没有Question并且允许紧接在前面的空格
  • (\d+) - 第 1 组:一个或多个数字
  • (?!\d) - 不允许紧跟在当前位置之后的数字。

在 Pandas 中,你可以这样使用它

df = pd.DataFrame({'text':[" Test T860 Article No. 9712250 787"," Test F199 Article Question 9712250787"]})
df['numbers'] = df['text'].str.findall(r'(?!^)(?<!\d)(?<!\bNo\.\s)(?<!\bQuestion\s)(\d+)(?!\d)').apply(','.join)

输出:

>>> df
                                     text  numbers
0       Test T860 Article No. 9712250 787  860,787
1   Test F199 Article Question 9712250787      199

关于python - 在特定条件下从字符串中提取数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56546141/

相关文章:

Python:计算 Pandas 系列中值的累积出现次数

python - 如何在python中将以0开头的十六进制字符串转换为一定长度的字节

java - 从以字符串形式给出的 Points 中获取数字

regex - 可以在 if 条件下比较部分字符串吗?

python - 从股票数据中获取每天第一笔交易的时间

python - 在 pandas 行中嵌套列名,尝试执行 unstack 类型操作

python - 为什么 Decimal(2**0.5) 没有给出预定义精度的数字?

python - 在 sklearn 中拟合多项式回归曲线时遇到问题

python - 如何使用 Python 确定 mp3 文件的比特率类型?

Python。替换 html 标签之间的文本