我有一些使用大熊猫存储在数据框中的字符串,如果存在,我想从中提取所有数字。这些数字必须满足的条件是非常具体的,我不确定是否可以使用正则表达式来解决问题。条件是:
如果可能的话,如果数字后面紧跟着e,我也想保留它。但是,这并不重要。
到目前为止,这是我找到所有数字的方法,但是我不知道如何编写上面提到的条件。
testNumbers = re.findall(r'\d+', row['Name'])
对于给定的字符串:“ Test T860商品编号9712250 787”
我希望正则表达式返回
[860, 787]
答案 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
如果不需要此表达式或您希望对其进行修改,请访问Demo。
regex101.com可视化正则表达式: