首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我需要写一个正则表达式,它可以识别所有带coma分隔的数字,不包括4位数字

我需要写一个正则表达式,它可以识别所有带coma分隔的数字,不包括4位数字
EN

Stack Overflow用户
提问于 2019-10-09 01:02:25
回答 4查看 128关注 0票数 0

我要捕获除4位数字外的所有数字,包括逗号或不用逗号分隔的数字:

我想要匹配这些数字(在我的例子中,数字总是由3位数字分隔)

代码语言:javascript
复制
978,763,835,536,363
123
123,456
123456
7456
3400

排除像这样的年份

代码语言:javascript
复制
1200 till 2020

我写了这篇文章

代码语言:javascript
复制
regex_patterns = [
re.compile(r'[0-9]+,?[0-9]+,?[0-9]+,?[0-9]+')
]

它工作的很好,我不知道如何从这些number...many中排除年份谢谢

当然,我是在做有知觉的工作,数字在句子里,不是必须的,一开始是这样的。

-Thus 60是41,因为100,000是65,656.2,这是βυ的合适大小这被发现是36,075,5621 (偏心率为9165),对应于火星的整个椭圆形路径。-It为4657。

编辑:

因为在我的任务中,我遇到了很多问题,我已经更新了这个问题几次。

首先,问题主要解决了!感谢大家的贡献。

这只是一个很小的问题。根据其他评论,我没有像下面这样集成解决方案。

代码语言:javascript
复制
r'(?<!\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)(?!/)

它可以正确地处理大多数情况,

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

然后,因为我的文本中有一种噪音,就像这样:

“我将ψο作为图形单位x。它的平方几何也将是图形单位x2。将εο上的平方几何相加,227,052,两者的和将是ψε或ψν的平方几何。但βν的平方几何是4,310,747,475段。”

它无法捕获以",“结尾的数字227,052

当我改变它的时候,我遇到了这个问题

代码语言:javascript
复制
(?<!\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)(?!/)
``` (basically ignoring comma  in (,?![\d])) 

我遇到了另一个问题,正则表达式捕获了4,310,747,475个这样的问题:

4,310,747,475x2+978,763,835,536,363

正如你在这里看到的..

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

任何想法都将不胜感激

然而,正则表达式现在几乎工作得很好,但为了更完美,我需要对其进行改进

-

代码语言:javascript
复制
EN

回答 4

Stack Overflow用户

发布于 2019-10-09 02:16:35

如果排除所有4位数字年份,则其为

\b(?!\d{4}\b)[0-9]+(?:,(?!\d{4}\b)[0-9]+)*\b

https://regex101.com/r/T3L3X5/1

如果仅排除1200到2020年之间的年数,则为

\b(?!(?:12\d{2}|1[3-9]\d{2}|20[01]\d|2020)\b)[0-9]+(?:,(?!(?:12\d{2}|1[3-9]\d{2}|20[01]\d|2020)\b)[0-9]+)*\b

https://regex101.com/r/ZuC6LR/1

票数 2
EN

Stack Overflow用户

发布于 2019-10-09 01:23:11

您可以使用下面的正则表达式来匹配一到三位数字,也可以选择匹配逗号分隔但不超过3位的任何后续数字。

代码语言:javascript
复制
\b\d{1,3}(?:,\d{1,3})*\b

https://regex101.com/r/T6sNUs/1/

解释是这样的,

  • \b -标记单词边界,以避免在大于3的数字中部分匹配digits
  • \d{1,3} -匹配一到三位数字number
  • (?:,\d{1,3})* -非捕获组可选地匹配具有一到三个digits
  • \b的逗号分隔数字-再次标记单词边界,以避免在大于3位的数字中部分匹配

编辑:对于注释中提到的要求,其中至少有三位或三位以上的数字应匹配,可选地用逗号分隔。但如果行中出现的任何数字在1200到2020年之间,它应该拒绝匹配。

这个正则表达式应该可以满足您的需求,

代码语言:javascript
复制
^(?!.*\b(?:1[2-9]\d\d|20[01]\d|2020)\b)\d{3,}(?:,\d{3,})*$

Demo

请确认这是否适用于您,因此我可以添加以上正则表达式的解释。

如果您希望它像您在评论中提到的那样限制在1200到1800之间,您可以使用此正则表达式,

代码语言:javascript
复制
^(?!.*\b(?:1[2-7]\d\d|1800)\b)\d{3,}(?:,\d{3,})*$

Demo

票数 1
EN

Stack Overflow用户

发布于 2019-10-09 21:19:36

这与您的所有测试用例都匹配:

代码语言:javascript
复制
(?<![\d,])(?:(?!(?:1[2-9]\d\d|20[01]\d|2020))\d{4,}|\d{1,3}(?:,\d{3})*)(?![\d,])

说明:

代码语言:javascript
复制
(?<![\d,])              # negative lookbehind, make we haven't digit or comma before
  (?:                   # non capture group
    (?!                 # negative lookahead, make sure we haven't after:
      (?:               # non capture group
        1[2-9]\d\d      # range 1200 -> 1999
       |                # OR
        20[01]\d        # range 2000 -> 2019
       |                # OR
        2020            # 2020
      )                 # end group
    )                   # end lookahead
    \d{4,}              # 4 or more digits
   |                    # OR
    \d{1,3}             # 1 up to 3 digits
    (?:,\d{3})*         # non capture group, a comma and 3 digits, 0 or more times
  )                     # end group
(?![\d,])               # negative lookahead, make sure we haven't digit or comma after

Demo

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58290918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档