正则表达式从字符串中提取价格
Regex Extracting Price out of 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})"
我的pattern只在big string中找到1,127, 20,200 10,而且也没有判断是否在(2)旁边的条件
我要全价:1,127.22 和 10.28
编辑:
设法用正则表达式得到美分:\d+(,\d{1,100})(.\d\d?)
(?<=\(2\))\s*((:?^|\s)(?=.)((?:0|(?:[1-9](?:\d*|\d{0,2}(?:,\d{3})*)))?(?:\.\d*[1-9])?)(?!\S))
从here
借用了num seq
你可以试试这个:
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]
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
您的 regex 匹配一个或多个数字 \d+
,然后在捕获的组中匹配一个逗号和一个数字 1 到 100 次。匹配 1,127
但不匹配 1,127.22
。正如您所提到的,也没有条件检查它是否在 (2) 旁边。
这个正则表达式可以是一个选项:
\(2\)\s(\d+[,.]\d+(?:[.]\d+)?)
说明
- 匹配 (2)
\(2\)
- 匹配空格
\s
- 捕获组
(
(这是您的值所在的位置)
- 匹配一个或多个数字,一个逗号或一个点和一个或多个数字
\d+[,.]\d+
- 一个可选的非捕获组,匹配一个点后跟一个或多个数字
(?:[.]\d+)?
- 关闭捕获组
我正在尝试从字符串中提取价格,但无法完全完成逻辑。
我的字符串:(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})"
我的pattern只在big string中找到1,127, 20,200 10,而且也没有判断是否在(2)旁边的条件
我要全价:1,127.22 和 10.28
编辑:
设法用正则表达式得到美分:\d+(,\d{1,100})(.\d\d?)
(?<=\(2\))\s*((:?^|\s)(?=.)((?:0|(?:[1-9](?:\d*|\d{0,2}(?:,\d{3})*)))?(?:\.\d*[1-9])?)(?!\S))
从here
借用了num seq你可以试试这个:
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]
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
您的 regex 匹配一个或多个数字 \d+
,然后在捕获的组中匹配一个逗号和一个数字 1 到 100 次。匹配 1,127
但不匹配 1,127.22
。正如您所提到的,也没有条件检查它是否在 (2) 旁边。
这个正则表达式可以是一个选项:
\(2\)\s(\d+[,.]\d+(?:[.]\d+)?)
说明
- 匹配 (2)
\(2\)
- 匹配空格
\s
- 捕获组
(
(这是您的值所在的位置) - 匹配一个或多个数字,一个逗号或一个点和一个或多个数字
\d+[,.]\d+
- 一个可选的非捕获组,匹配一个点后跟一个或多个数字
(?:[.]\d+)?
- 关闭捕获组