在一定条件下从字符串中提取数字

2024-09-28 01:23:27 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

如果可能的话,如果数字后面有一个e,我也会保留它。然而,这并不重要。你知道吗

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

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

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

我希望正则表达式返回

[860, 787]

Tags: 数据字符串nametestrepandas编码article
2条回答

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

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

Demo

正则表达式

如果不需要此表达式或您希望修改它,请访问regex101.com。你知道吗

正则表达式电路

jex.im可视化正则表达式:

enter image description here

你可以用

(?!^)(?<!\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)-noQuestion并且允许前面有一个空格
  • (\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

相关问题 更多 >

    热门问题