在某些条件下从字符串中提取数字

时间:2019-06-11 14:35:05

标签: python regex pandas

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

  • 数字不能在字符串的开头
  • 它不能出现在“编号”之后或“问题”之后。

如果可能的话,如果数字后面紧跟着e,我也想保留它。但是,这并不重要。

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

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

对于给定的字符串:“ Test T860商品编号9712250 787”

我希望正则表达式返回

[860, 787]

2 个答案:

答案 0 :(得分:5)

您可以使用

(?!^)(?<!\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)-当前位置允许后立即没有数字。

在熊猫中,您可以使用它

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

答案 1 :(得分:0)

在这里,我们可以使用带有单词边界和量词的表达式:

\b[A-Z]+(\d+)\b|\b([0-9]{1,3})\b

twitter

RegEx

如果不需要此表达式或您希望对其进行修改,请访问Demo

RegEx电路

regex101.com可视化正则表达式:

jex.im