我有一个pandas DataFrame,其中一列价格包含各种形式的字符串,例如US$250.00
,MYR35.50
和S$50
,并且在开发合适的正则表达式时遇到了麻烦为了将非数字部分与数字部分分开。我想要的最终结果是将这一列价格拆分为两个新列。其中一列将字母部分保存为字符串并命名为" Currency",而另一列将数字保存为" Price"。
我在字符串中遇到的唯一可能的字母部分,在数字部分之前,只是形式:US$
,BAHT
,MYR
,S$
。有时在字母部分和数字部分之间可能存在空格,有时可能没有。我需要的所有帮助只是为这项工作找出正确的正则表达式。
请帮忙!非常感谢你!
答案 0 :(得分:0)
您可以使用正则表达式在每个单元格上使用re.match
:
import re
cell = 'US$50.00'
result = re.match(r'([A-Z$]+)\s*([\d.]+)', cell)
print(result.groups()[0], result.groups()[1])
相关的不同部分以组的形式捕获,可以单独访问,而忽略可选的空格。
答案 1 :(得分:0)
欺骗是在搜索模式中使用'\ $ * *'。
由于$是RegEx中的元字符,因此需要将其转义为字面值$。所以'\ $ *'部分告诉RegRx $符号可能出现零次或多次。类似地,'*'告诉RegEx空间可能出现零次或多次。 希望这会有所帮助。
>>> import re
>>> string = 'Rs50 US$56 MYR83 S$102 Baht 105 Us$77'
>>> M = re.findall(r'[A-z]+\$*',string)
>>> M
['Rs', 'US$', 'MYR', 'S$', 'Baht', 'Us$']
>>> C = re.findall(r'[A-z]+\$* *([0-9]+)',string)
>>> C
['50', '56', '83', '102', '105', '77']
答案 2 :(得分:0)
如果您想扩展@Tristan对pandas的回答,您可以使用extractall
访问者中的str
方法。
首先创建一些数据
s=pd.Series(['US$250.00', 'MYR35.50','&*', 'S$ 50', '50'])
0 US$250.00
1 MYR35.50
2 &*
3 S$ 50
4 50
然后使用extractall
。请注意,此方法会跳过没有匹配项的行。
s.str.extractall('([A-Z$]+)\s*([\d.]+)')
0 1
match
0 0 US$ 250.00
1 0 MYR 35.50
3 0 S$ 50
答案 3 :(得分:0)
使用此正则表达式
^([^0-9]+)([0-9]+\.?[0-9]*)$
第1组将是货币部分,第2组将是数字部分: