第一次发布,我潜伏了一会儿,对这里的帮助社区感到非常兴奋。Python,正则表达式匹配数字,x,xxx,xxx,但不是xx,xx,x,
因此,由铝Sweigart
“自动无聊的东西”这样做,需要我建立在标准的数字格式发现号的正则表达式的锻炼工作。三位数字,逗号,三位数字,逗号等...
所以希望匹配1,234和23,322和1,234,567和12,但不是1,23,1或1111或其他愚蠢的东西。
我有以下几点。
import re
testStr = '1,234,343'
matches = []
numComma = re.compile(r'^(\d{1,3})*(,\d{3})*$')
for group in numComma.findall(str(testStr)):
Num = group
print(str(Num) + '-') #Printing here to test each loop
matches.append(str(Num[0]))
#if len(matches) > 0:
# print(''.join(matches))
,输出这个....
( '1',” 343' ) -
我不知道为什么中间的” 234" 被跳过。我相信,正则表达式有什么问题。只是似乎无法把我的头围绕在这一个。
任何帮助或解释将不胜感激。
跟随编辑。因此,在遵循我可以吸收的所有建议之后,我将它完美地用于多种输入。
import re
testStr = '1,234,343'
numComma = re.compile(r'^(?:\d{1,3})(?:,\d{3})*$')
Num = numComma.findall(testStr)
print(Num)
给我....
[ '1234343']
太好了!但!什么时候我的字符串输入更改为类似
“1234343和12345”
相同的代码返回....
[]
哎呀...大声笑,这是有趣的, 我必须承认。
因此,练习的目的是能够最终扫描一段文本并挑选出这种格式的所有数字。任何见解?我认为这将增加一个额外的元组,而不是返回一个空的...
跟进编辑:
所以,一天后(一直忙于3个女儿和蜂蜜待办事项列表),我已经终于能够坐下来检查我收到的所有帮助。这是我想出来的,它看起来工作得很好。包括评论为我自己的个人理解。再次感谢Blckknght,Saleem,mhawke和BHustus。
我的最终代码:
import re
testStr = '12,454 So hopefully will match 1,234 and 23,322 and 1,234,567 and 12 but not 1,23,1 or ,,1111, or anything else silly.'
numComma = re.compile(r'''
(?:(?<=^)|(?<=\s)) # Looks behind the Match for start of line and whitespace
((?:\d{1,3}) # Matches on groups of 1-3 numbers.
(?:,\d{3})*) # Matches on groups of 3 numbers preceded by a comma
(?=\s|$)''', re.VERBOSE) # Looks ahead of match for end of line and whitespace
Num = numComma.findall(testStr)
print(Num)
将返回:
['12,454' , '1,234','23,322' , '1,234,567', '12']
再次感谢!我在这里有这样一个积极的第一次发布经验,令人惊叹。=)
你为什么使用findall? – Alex
这不是问题,但你的正则表达式是错误的。第一个'*'是一个错误,它允许模式匹配非标准格式的东西:例如''1234''和'',123''。 –
我使用的是findall,因为我是一个完全彻底的新手,摸索着他的方式:)我会阅读不同的方法,并遵循这里流动的建议。 –