python正则表达式匹配数字或者逗号_关于python:正则表达式每三位数与一个数字匹配一个逗号...

您将如何编写一个正则表达式,使每三位数字与逗号匹配?它必须匹配以下内容:" 42"," 1,234"和" 6,368,745"。

但不能包含以下内容:" 12,34,567"(逗号之间只有两位数字)," 1234"(缺少逗号)。

我知道这个问题以前曾被问过和回答过,但这些只是用于传递给正则表达式的字符串是其中一个数字的解决方案。我想知道如果将正则表达式传递给整个字符串'42 1,234 6,368,745 12,34,567 1234',那是最好的方法。

我设法通过首先分割字符串,然后像下面这样遍历它来做到这一点:

regexsplit = re.compile(r'^\d{1,3}(,\d{3})*$')

splitstring = string.split()

matches = []

for num in splitstring:

if regexsplit.search(num) is not None:

matches.append(regexsplit.search(num).group())

print matches

首先,我想知道是否有更有效的方式编写该代码。其次,我想知道是否有一种方法可以在不分割字符串的情况下使用.findall()方法。我知道您将不再能够使用^和$锚定开始和结束,因此我完成了:

regexnosplit = re.compile(r'(\d{1,3}(,\d{3})*)')

matches2 = []

for groups in regexnosplit.findall(string):

print groups[0]

但是,我显然仍然返回'12','34,567','123','4',因此我猜测我需要通过一个更可靠的正则表达式,但似乎找不到解决方案。

您需要确保匹配项在数字的结尾处结束-查看单词边界和否定先行。

您可以使用

^((?:\d{1,3},(?:\d{3},)*\d{3})|(?:\d{1,3}))$

演示与说明

不知道这是什么格式,但是在c ++中不起作用

是PCRE。 有多个c ++库。 您正在使用哪个?

它适用于Python,Perl,Go,Javascript等。

我使用c ++ 11附带的软件。 我认为它只是grep和ecma。

@dawg感谢敌人正则表达式! 我也无法快速运行它,这就是为什么要稍作更改的原因:所有可选值,例如?:我移到方括号后,仅使用?,以表明该部分是可选的,结果:^((| 0| d{1,3}\( d{0,2}))|。?([1-9][0-9]{0,2}))$?

对我有用的那个:

rgx = re.compile(r'^\d{1,3}(\,\d{3})*$')

您可以在这里查看:https://regex101.com/r/TsTNQm/1

您可以使用空格边界来匹配格式正确的字符

千位逗号数字。

(?

解释

(?

\d{1,3}              # Required 1-3 digits

(?: , \d{3} )*       # Optional comma + 3 digits, 0 to many times

(?! \S )             # Whitespace boundary

测试目标42 1,234 6,368,745 12,34,567 1234

产量

**  Grp 0 -  ( pos 0 , len 2 )

42

**  Grp 0 -  ( pos 3 , len 5 )

1,234

**  Grp 0 -  ( pos 9 , len 9 )

6,368,745

我会这样做,试图找到不需要的模式:

import re

s = '42 1,234 6,368,745 12,34,567 1234'

rgx = re.compile(',[0-9]{1,2},|[0-9]{4,}')

nums = [x for x in s.split() if not rgx.search(x)]

print nums  # ['42', '1,234', '6,368,745']

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值