gpt4 book ai didi

Python,正则表达式匹配数字,x,xxx,xxx 但不匹配 xx,xx,x,

转载 作者:太空宇宙 更新时间:2023-11-03 14:12:54 26 4
gpt4 key购买 nike

第一次发帖,我潜伏了一段时间,对这里有用的社区感到非常兴奋。

因此,使用 Al 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)

给我....

['1,234,343']

太棒了!但!当我将字符串输入更改为类似

'1,234,343 和 12,345'

相同的代码返回....

[]

Grrr...哈哈,这很有趣,我必须承认。

因此练习的目的是最终能够扫描一段文本并挑选出这种格式的所有数字。有什么见解吗?我认为这会添加一个额外的元组,而不是返回一个空元组......

后续编辑:

所以,一天后(忙于 3 个女儿和 Honey-do 名单),我终于能够坐下来检查我收到的所有帮助。这是我想出的,它似乎可以完美地工作。包括我个人理解的评论。再次感谢 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']

再次感谢!我在这里有如此积极的第一次发帖经历,太棒了。 =)

最佳答案

问题是由于您在模式中使用了重复的捕获组 (,\d{3})*。 Python 的正则表达式引擎会将其与您的数字的千位和个位组进行匹配,但只会捕获最后一次重复。

我怀疑您想改用非捕获组。添加 ?: 到每组括号的开头(我还建议,在一般原则上,使用原始字符串,尽管您当前的模式中没有转义问题):

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

由于没有组被捕获,re.findall 将返回整个匹配的文本,我认为这就是您想要的。您还可以使用 re.findre.search 并在返回的 match 上调用 group() 方法对象以获取整个匹配的文本。

关于Python,正则表达式匹配数字,x,xxx,xxx 但不匹配 xx,xx,x,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35823052/

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