我试图仅提取包括千位分隔符和十进制值在内的数字部分,但始终会以错误的格式获取错误的输入字符串。
我的输入字符串将采用以下格式
1200美元1,200.12美元
我分别需要以下输出
1200 1,200.12
如果我在下面使用,则第一次出现时,被视为定界符
import os
process_names= ["script1.py", "script2.py", "script3.py"] # change this to the name of your process
tmp = os.popen("ps -Af").read()
for process_name in process_names
if process_name not in tmp[:]:
print ("The {0} is not running.".format(process_name)) #this is in python 3x style
else:
print ("The {0} is running.".format(process_name))
如果我使用这个,我会报错
string prodValue = Regex.Match(prodAmount, @"\d+").Value;
如何提取所需的输出?
答案 0 :(得分:2)
要捕获多个匹配项,您需要Regex.Matches
而不是Regex.Match
。另外,在正则表达式中,您需要将逗号组设置为零个或多个出现,并将点组设置为可选项,因为要捕获的数字可能存在也可能不存在。
您可以使用此正则表达式,
\d+(?:,\d+)*(?:\.\d+)?
说明:
\d+
->匹配一个或多个数字(?:,\d+)*
->匹配一个逗号,后跟一个或多个数字零次或多次(?:\.\d+)?
->(可选)匹配文字点后跟一个或多个数字这是示例C#代码,
MatchCollection matches = Regex.Matches("USD1200 1,200.12 1,211,234,332.12 12,333 USD", @"\d+(?:,\d+)*(?:\.\d+)?");
for (int i = 0; i < matches.Count;i++) {
Console.WriteLine("Match: " + matches[i]);
}
这将提供您期望的以下输出,
Match: 1200
Match: 1,200.12
Match: 1,211,234,332.12
Match: 12,333
答案 1 :(得分:0)
我认为您错误地输入了第二个“ +”,而错过了第三个。
@"^[0-9]+,[0-9]+\.[0-9]+?$")
答案 2 :(得分:0)
答案 3 :(得分:0)
在正则表达式中,您使用锚点^
来声明字符串$
的开始和结尾USD
,其中(,[0-9]+)*
未被考虑并且不匹配。如果要进行多次匹配,则应改用Regex.Matches。
要匹配不带点或逗号的数字,中间部分应该匹配0+次,因为最后一部分已经是可选的,并且字符类中的数字需要一个量词来匹配1+次,例如USD
。请注意,您不必转义逗号。
如果\bUSD(?<n1>\d+)|(?<n2>\d{1,3}(?:,\d{3})*(?:\.\d+)?) USD\b
是匹配项的一部分,则可以使用替代项来匹配USD1200或1,200.12 USD,而不是匹配所有数字。
您可以使用命名捕获组来按名称引用该组。
\bUSD
那会匹配
(?<n1>\d+)
匹配单词边界和USD n1
命名为捕获组|
,它将匹配1个以上的数字(?<n2>
或n2
开始命名捕获组\d{1,3}
(?:,\d{3})*
匹配1-3位数字(?:\.\d+)?
匹配一个逗号,3位数字并重复0次以上)
匹配点和1个以上的数字并使其可选USD\b
关闭命名的捕获组
$text = Hello, this is
example text.
匹配空格,USD和单词边界