我正在尝试在一个字符串中检查我使用的最多 3 个数字:
regex = re.compile("\d{0,3}")
但这不起作用,例如,1234
即使数字字符串长度超过 3,该正则表达式也会接受该字符串。
如果要检查字符串中最多 3 位的字符串,则需要使用'\d{4,}'
,因为您只对长度为 3 的数字字符串感兴趣。
import re
str='123abc1234def12'
print re.findall('\d{4,}',str)
>>> '[1234]'
如果您使用{0,3}
:
str='123456'
print re.findall('\d{0,3}',str)
>>> ['123', '456', '']
匹配最大长度为 3的regex
数字字符串和空字符串,但这不能用于测试正确性。在这里,您无法检查所有数字字符串是否都是长度,但您可以轻松检查长度范围内的数字字符串。
所以要测试做这样的事情:
str='1234'
if re.match('\d{4,}',str):
print 'Max digit string too long!'
>>> Max digit string too long!
\d{0}
匹配所有可能的字符串。不清楚您所说的“不起作用”是什么意思,但是如果您希望将字符串与数字匹配,请将重复运算符增加到{1,3}
.
如果您希望排除 4 次或更多的运行,请尝试类似(?:^|\D)\d{1,3}(?:\D|$)
的方法,当然,如果您想捕获匹配,请使用捕获括号\d{1,3}
。
可能有几个原因:
由于您想\d
搜索数字或数字,您可能应该将其拼写为"\\d"
or r"\d"
。"\d"
可能碰巧起作用,但这只是因为d
在字符串中(还)不是特别的。"\n"
or "\f"
or"\r"
会做一些完全不同的事情。查看re 模块文档并搜索“原始字符串”。
"\\d{0,3}"
几乎可以匹配任何东西,因为 {0,3} 表示“零或最多三个”。因此,它将匹配任何字符串的开头,因为任何字符串都以空字符串开头。
或者,也许您想搜索只有零到三个数字的字符串,没有别的。在这种情况下,您想使用类似r"^\d{0,3}$"
. 原因是正则表达式匹配字符串中的任何位置(或者,如果您使用re.match
而不是,则仅在开头re.search
)。^
匹配字符串的开头,并$
匹配结尾,因此通过将它们放在每一端,您不匹配任何具有 before 或 after 的内容\d{0,3}
。
您使用的方法是查找具有 0-3 个数字的子字符串,它无法达到您的预期。我的解决方法:
>>> import re
>>> re.findall('\d','ds1hg2jh4jh5')
['1', '2', '4', '5']
>>> res = re.findall('\d','ds1hg2jh4jh5')
>>> len(res)
4
>>> res = re.findall('\d','23425')
>>> len(res)
5
所以,接下来你只需要使用'if'来判断数字的数量。