gpt4 book ai didi

python - 使用正则表达式用逗号或点捕获数字

转载 作者:行者123 更新时间:2023-12-01 00:28:09 26 4
gpt4 key购买 nike

我有正则表达式代码

https://regex101.com/r/o5gdDt/8

正如你看到的这段代码

(?<!\S)(?<![\d,])(?:(?!(?:1[2-9]\d\d|20[01]\d|2020))\d{4,}[\u00BC-\u00BE\u2150-\u215E]?|\d{1,3}(?:,\d{3})+)(?![\d,])[\u00BC-\u00BE\u2150-\u215E]?(?!x)(?!/)

可以捕获文本中由 3 位数字组成的所有数字,例如

  • “这是 100,100”
  • “23,456”
  • “1,435”

所有超过 4 位数字,如不使用逗号分隔

  • 2345

  • 1234“这里是 123456”

也是这种数

  • 65,656½
  • 65,656½,
  • 23,123½

这里唯一的小问题是,如果前两种类型后面有一个逗号(点),它就无法捕获它们。例如,它无法捕获

  • “这是 100,100,”
  • “23,456,”
  • “1,435,”

不幸的是,有一些以逗号结尾的数字文本...有人可以告诉我如何修改它以捕获上面的内容吗?

我尝试过这样做,修改后的版本是这样的:

(?<!\S)(?<![\d,])(?:(?!(?:1[2-9]\d\d|20[01]\d|2020))\d{4,}[\u00BC-\u00BE\u2150-\u215E]?|\d{1,3}(?:,\d{3})+)(?![\d])[\u00BC-\u00BE\u2150-\u215E]?(?!x)(?!/)

基本上我删除了 (?![\d,]) 中的逗号,但这会导致我的上下文中出现另一个问题它捕获作为等式一部分的数字的一部分,如下所示:

4,310,747,475x2 57,349,565,416,398x。

看这里:

https://regex101.com/r/o5gdDt/10

我知道这是一个特殊的问题,我很高兴了解您的想法

最佳答案

这里的主要问题是 (?![\d,])任何后跟数字或逗号的匹配都会失败,而您希望后跟数字或逗号数字时匹配失败。

替换(?![\d,])(?!,?\d) .

此外,(?<!\S)(?<![\d,])看起来多余,如 (?<!\S)需要空格或字符串开头,这肯定不是数字或 , 。要么使用(?<!\S)(?<!\d)(?<!\d,)根据您的要求。

使用 OR 连接否定前瞻:(?!x)(?!/) => (?!x|/) => (?![x/]) .

你想要避免匹配年份,但你只是失败了所有以它们开头的数字,所以 2020222不会被匹配。添加(?!\d)到前瞻,(?!(?:1[2-9]\d\d|20[01]\d|2020)(?!\d)) .

所以,模式可能看起来像

(?<!\S)(?:(?!(?:1[2-9]\d\d|20[01]\d|2020)(?!\d))\d{4,}[\u00BC-\u00BE\u2150-\u215E]?|\d{1,3}(?:,\d{3})+)(?!,?\d)[\u00BC-\u00BE\u2150-\u215E]?(?![x/])

请参阅regex demo .

重要:您有 [\u00BC-\u00BE\u2150-\u215E]?(?![x/])最后,在可选模式之后进行否定前瞻。一旦引擎无法找到 x 的匹配项或/ ,它会回溯并且很可能会找到部分匹配。如果你不想匹配65,65665,656½x ,替换[\u00BC-\u00BE\u2150-\u215E]?(?![x/])(?![\u00BC-\u00BE\u2150-\u215E]?[x/])[\u00BC-\u00BE\u2150-\u215E]? .

参见another regex demo .

关于python - 使用正则表达式用逗号或点捕获数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58391227/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com