正则表达式从字符串中提取价格

时间:2018-01-11 23:37:55

标签: c# python regex vb.net uipath

我试图从字符串中提取价格,但无法完全完成逻辑。

My String:(2)1,127.22 abcdfg sdkjf 20,200.01 abcdfg sdfkgj(2)10.28

我想做的是:

to find all "(2)" in the string and then extract the full price next to it. 

My regex pattern is: "\d+(,\d{1,100})"

我的模式只在大字符串中找到1,127,20,200 10,并且它也没有检查它是否在(2)旁边的条件。

我想得到全价:1,127.22和10.28

编辑:

管理以获得正则表达式的美分:\ d +(,\ d {1,100})(。\ d \ d?)

4 个答案:

答案 0 :(得分:2)

您的regex匹配一个或多个数字\d+,然后在捕获的组中匹配逗号和数字1到100次。该匹配1,127但不匹配1,127.22。如你所述,也没有条件检查它是否在(2)旁边。

这个正则表达式可以选择这样做:

\(2\)\s(\d+[,.]\d+(?:[.]\d+)?)

<强>解释

  • 匹配(2)\(2\)
  • 匹配空白\s
  • 捕获组((这是您的值所在的位置)
  • 匹配一个或多个数字,逗号或点以及一个或多个数字\d+[,.]\d+
  • 一个可选的非捕获组,它匹配一个点后跟一个或多个数字(?:[.]\d+)?
  • 关闭捕获组

Output with C#

答案 1 :(得分:1)

你可以试试这个:

import re
s = "(2) 1,127.22 abcdfg sdkjf 20,200.01 abcdfg sdfkgj (2) 10.28"
vals = re.findall('(?<=\d\)\s)[\d\.,]+', s)

输出:

['1,127.22', '10.28']

如果你想要一个浮点数列表,而不是字符串:

vals = list(map(lambda x:float(re.sub(',', '', x)), re.findall('(?<=\d\)\s)[\d\.,]+', s)))

输出:

[1127.22, 10.28]

答案 2 :(得分:0)

(?<=\(2\))\s*((:?^|\s)(?=.)((?:0|(?:[1-9](?:\d*|\d{0,2}(?:,\d{3})*)))?(?:\.\d*[1-9])?)(?!\S))

借用here

中的num seq

答案 3 :(得分:0)

VB.NET回答没有正则表达式。向您展示如何使用字符串

        Dim SplitStr As String() = New String() {"(2)"}
        Dim mystring As String = "(2) 1,127.22 abcdfg sdkjf 20,200.01 abcdfg sdfkgj (2) 10.28"

        Dim PriceList As New List(Of Decimal)
        For Each xItem In mystring.Split(SplitStr, StringSplitOptions.RemoveEmptyEntries)
            PriceList.Add(Convert.ToDecimal(xItem.Split(New Char() {" "}, StringSplitOptions.RemoveEmptyEntries)(0)))
        Next