最后只获取数字(正则表达式)

时间:2021-05-09 03:03:32

标签: python regex pandas

我想获得以下短语结尾的数字(整数):

VISTA AES TIETE E UNT N2 600 
VISTA IT AUUNIBANCO PN N1 1.400
OPCAO DE VENDA 04/21 COGNP450ON 4,50COGNE 100.000

我的意思是:600、1400、100000。稍后我会将它们中的每一个都添加到数据库中。

我尝试使用正则表达式: (?<=\s)(\d*\s*)|(\d*.\d*)$

但是它没有正常工作。有什么想法吗?

PS:我们使用点而不是逗号来表示一千:1.000,而不是 1,000。

3 个答案:

答案 0 :(得分:2)

实际上对于您的用例,我认为您甚至不需要 regex

你可以只拆分字符串并取最后一个,并用空字符串替换点

如果是数据框(因为你已经标记了 Pandas),

> df['colName'].str.split().str[-1].str.replace('.', '')
0       600
1      1400
2    100000
Name: colName, dtype: object

如果是字符串列表

> list(map(lambda x: x.replace('.', ''),map(lambda x: x.split()[-1], data)))
['600', '1400', '100000']

答案 1 :(得分:1)

l = ["VISTA AES TIETE E UNT N2 600",
"VISTA IT AUUNIBANCO PN N1 1.400",
"OPCAO DE VENDA 04/21 COGNP450ON 4,50COGNE 100.000"]

如果数据是dataframe的形式。

df=DataFrame({
    'col':l
})
df.col.str.extract('(\d*\.*\d*)?$').astype(str).replace('\.','', regex=True)

输出

0   600
1   1400
2   100000

答案 2 :(得分:1)

在您尝试的模式中,这部分 (?<=\s)(\d*\s*) 匹配可选数字,后跟可选空格字符,而左侧必须有一个空格字符。

这也将获得字符串中左边有空格字符的所有位置,因为匹配中的数字和空格字符是可选的。

在这部分 (\d*\.\d*)$ 中,数字是可选的,因此它也可以只匹配字符串末尾的一个点。


如果最后的数字前必须有一个空格字符,您可以使用:

(?<=\s)\d{1,3}(?:\.\d{3})*$

模式匹配:

  • (?<=\s) 正向后视,从当前位置向左断言一个空白字符
  • \d{1,3} 匹配 1-3 位数字
  • (?:\.\d{3})* 可选择重复一个点和 3 个数字
  • $ 字符串结束

看到一个 regex demo

如果数字也可以单独存在,您可以在左侧断言一个空白边界 (?<!\S)

(?<!\S)\d{1,3}(?:\.\d{3})*$

看到另一个regex demo

例如,使用 str.extract 并将模式包装在捕获组中:

import pandas as pd

strings = [
    "VISTA AES TIETE E UNT N2 600",
    "VISTA IT AUUNIBANCO PN N1 1.400",
    "OPCAO DE VENDA 04/21 COGNP450ON 4,50COGNE 100.000"
]

df = pd.DataFrame(strings, columns=["colName"])
df['lastNumbers'] = df['colName'].str.extract(r"(?<=\s)(\d{1,3}(?:\.\d{3})*)$")

print(df)

输出

                                             colName lastNumbers
0                       VISTA AES TIETE E UNT N2 600         600
1                    VISTA IT AUUNIBANCO PN N1 1.400       1.400
2  OPCAO DE VENDA 04/21 COGNP450ON 4,50COGNE 100.000     100.000