您将如何编写一个正则表达式,使每三位数字与逗号匹配?它必须匹配以下内容:" 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']