使用正则表达式从行为模式中获取数值
Get numerical values from a behavior pattern with Regex
我正在尝试创建一个可以涵盖文本模式的大部分可能性的正则表达式。我要查找的格式是可以带有不同货币值的列表的数值。
在我能找到的行为中,结果如下:
$ 8
预期结果:8
$ 12.548
预期结果:12.548
$ -8
预期结果:-8
$ -6.098
预期结果:-6.098
$ -59
预期结果:-59
$ 778
预期结果:778
$ 73
预期结果:73
请务必注意,一次只会出现一条记录,但结果可以采用之前显示的任何格式。同样在模式中,$ 符号将始终出现。
我需要一个可以找到所有数值的正则表达式,但是最让我复杂化的是带有负数的模式。
我的表达,只给我带来正值:
(\d+(\.\d+)?(?=$|))
作为信息,我使用 Python 3.7 并使用 re.findall 函数搜索那些记录
有什么想法可以合并负数吗?我必须有条件地做吗?
要匹配您提供的所有示例,您可以试试这个:
[-\d]
匹配“前面带有或不带有 - 符号的任何数字,并忽略其他所有内容。
要匹配文字 $
,您必须将其转义:$
,否则它将尝试匹配行尾。
匹配一个整数,可以用\d
匹配一个数字,要求匹配一个或多个:\d+
匹配小数部分比较棘手:您要匹配点,然后是它后面的一些数字:\.\d+
。您需要转义 .
,否则它将匹配任何字符。
但是您还想使用 ?
将整个内容匹配零次或一次。一个明显的方法是 (\.\d+)?
,但那将是一个 捕获 组,并且您可能想要捕获整个数字,而不是单独的小数部分。所以你使用了一个非捕获组:(?:\.\d+)?
您也不希望在数字之后出现任何其他字符,因此您希望匹配行尾,即$
。
现在一起:
$ (\d+(?:\.\d+)?)$
为了更好地理解它是如何工作的,我推荐一个像 https://regex101.com/.
这样的工具
啊,是的,可选减号;我打赌你现在可以在没有我帮助的情况下应付。
您现有的正数正则表达式已经很好了。您可以稍微修改它以增强它以支持负数,如下所示:
-?\d+(?:\.\d+)?
如果只想匹配数字后面没有任何其他字符,可以使用:
-?\d+(?:\.\d+)?$
详情:
-?
字面上匹配 -
但通过 ?
使其可选
\d+
匹配一个或多个数字的整数部分
(?:
为可选的小数部分创建一个非捕获组
\.\d+
匹配一个小数点后跟一个或多个小数点数字
)?
可选小数部分结束
$
这是断言行尾的锚点,因此如果数字后面有任何字符,则不会匹配整个数字。
我想调整我以前的答案,当我只考虑 op 想要匹配的示例语法时,这个答案很短。如果 op 想要查看一个或多个符号 $ 后面的特定数字并忽略任何“。”和“,”之间,稍微复杂一点。 OP 非常接近正确答案(在搜索 google 方面),当他使用 (?=$) 向前看时,它指的是“数字必须跟在符号 $ 后面”的条件,没有提到“|”在他的完整解决方案中:
(\d+(\.\d+)?(?=$|))
幸运的是,这帮助他逃脱了错误条件,并再次将每组数字与“。”进行匹配。之间。虽然这不是我们想要的答案。
由于我们希望我们的条件以“$”开头,以区别于任何不属于我们关心的钱的随机数,我们以:
(?<=$)
完整语法:
(?<=$)(-?[0-9]+\.[0-9]+)
对于仅包含“.”的模式和:
(?<=$)(-?[0-9]+\.[0-9]+)|(-?[0-9]+\,[0-9]+)
对于同时包含“.”的模式和“,”但不是“。”和“,”之间的数字,例如以下字符串:
" $-99.000 .0000 $$9,000 $-99,000ppjujj okeer134124- "
代码应该给你:
[('-99.000', ''), ('10.0000', ''), ('', '999,000'), ('', '-99,000')]
希望对您有所帮助。
我正在尝试创建一个可以涵盖文本模式的大部分可能性的正则表达式。我要查找的格式是可以带有不同货币值的列表的数值。
在我能找到的行为中,结果如下:
$ 8
预期结果:8
$ 12.548
预期结果:12.548
$ -8
预期结果:-8
$ -6.098
预期结果:-6.098
$ -59
预期结果:-59
$ 778
预期结果:778
$ 73
预期结果:73
请务必注意,一次只会出现一条记录,但结果可以采用之前显示的任何格式。同样在模式中,$ 符号将始终出现。
我需要一个可以找到所有数值的正则表达式,但是最让我复杂化的是带有负数的模式。
我的表达,只给我带来正值:
(\d+(\.\d+)?(?=$|))
作为信息,我使用 Python 3.7 并使用 re.findall 函数搜索那些记录
有什么想法可以合并负数吗?我必须有条件地做吗?
要匹配您提供的所有示例,您可以试试这个:
[-\d]
匹配“前面带有或不带有 - 符号的任何数字,并忽略其他所有内容。
要匹配文字 $
,您必须将其转义:$
,否则它将尝试匹配行尾。
匹配一个整数,可以用\d
匹配一个数字,要求匹配一个或多个:\d+
匹配小数部分比较棘手:您要匹配点,然后是它后面的一些数字:\.\d+
。您需要转义 .
,否则它将匹配任何字符。
但是您还想使用 ?
将整个内容匹配零次或一次。一个明显的方法是 (\.\d+)?
,但那将是一个 捕获 组,并且您可能想要捕获整个数字,而不是单独的小数部分。所以你使用了一个非捕获组:(?:\.\d+)?
您也不希望在数字之后出现任何其他字符,因此您希望匹配行尾,即$
。
现在一起:
$ (\d+(?:\.\d+)?)$
为了更好地理解它是如何工作的,我推荐一个像 https://regex101.com/.
这样的工具啊,是的,可选减号;我打赌你现在可以在没有我帮助的情况下应付。
您现有的正数正则表达式已经很好了。您可以稍微修改它以增强它以支持负数,如下所示:
-?\d+(?:\.\d+)?
如果只想匹配数字后面没有任何其他字符,可以使用:
-?\d+(?:\.\d+)?$
详情:
-?
字面上匹配 -
但通过 ?
\d+
匹配一个或多个数字的整数部分
(?:
为可选的小数部分创建一个非捕获组
\.\d+
匹配一个小数点后跟一个或多个小数点数字
)?
可选小数部分结束
$
这是断言行尾的锚点,因此如果数字后面有任何字符,则不会匹配整个数字。
我想调整我以前的答案,当我只考虑 op 想要匹配的示例语法时,这个答案很短。如果 op 想要查看一个或多个符号 $ 后面的特定数字并忽略任何“。”和“,”之间,稍微复杂一点。 OP 非常接近正确答案(在搜索 google 方面),当他使用 (?=$) 向前看时,它指的是“数字必须跟在符号 $ 后面”的条件,没有提到“|”在他的完整解决方案中:
(\d+(\.\d+)?(?=$|))
幸运的是,这帮助他逃脱了错误条件,并再次将每组数字与“。”进行匹配。之间。虽然这不是我们想要的答案。
由于我们希望我们的条件以“$”开头,以区别于任何不属于我们关心的钱的随机数,我们以:
(?<=$)
完整语法:
(?<=$)(-?[0-9]+\.[0-9]+)
对于仅包含“.”的模式和:
(?<=$)(-?[0-9]+\.[0-9]+)|(-?[0-9]+\,[0-9]+)
对于同时包含“.”的模式和“,”但不是“。”和“,”之间的数字,例如以下字符串:
" $-99.000 .0000 $$9,000 $-99,000ppjujj okeer134124- "
代码应该给你:
[('-99.000', ''), ('10.0000', ''), ('', '999,000'), ('', '-99,000')]
希望对您有所帮助。