我有一些字符串存储在使用 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/