我想仅获得以下短语结尾的数字(整数):
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。
答案 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