Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python正则表达式匹配所有5位数字,但不匹配更大的数字_Python_Regex - Fatal编程技术网

Python正则表达式匹配所有5位数字,但不匹配更大的数字

Python正则表达式匹配所有5位数字,但不匹配更大的数字,python,regex,Python,Regex,我正试图在HTML网页中使用字符串匹配5位数的优惠券代码。例如,53232,21032,40021等。。。我可以用[0-9]{5}处理任何5位字符串的简单情况,尽管这也匹配6、7、8。。。n位数字。有人能建议我如何修改这个正则表达式以只匹配5位数字吗?不填充字符串的特殊情况开头和结尾,因为在回答中,可以使用否定的lookahead和lookahead用一个正则表达式处理这两种情况 >>> import re >>> s = "88888 999999 3333

我正试图在HTML网页中使用字符串匹配5位数的优惠券代码。例如,
53232
21032
40021
等。。。我可以用
[0-9]{5}
处理任何5位字符串的简单情况,尽管这也匹配6、7、8。。。n位数字。有人能建议我如何修改这个正则表达式以只匹配5位数字吗?

不填充字符串的特殊情况开头和结尾,因为在回答中,可以使用否定的lookahead和lookahead用一个正则表达式处理这两种情况

>>> import re
>>> s = "88888 999999 3333 aaa 12345 hfsjkq 98765"
>>> re.findall(r"(?<!\d)\d{5}(?!\d)", s)
['88888', '12345', '98765']
>>重新导入
>>>s=“8889999993333 aaa 12345 hfsjkq 98765”

>>>关于findall(r)(?完整字符串:
^[0-9]{5}$


在一个字符串中:
[^0-9][0-9]{5}[^0-9]

一个非常简单的方法是匹配所有的数字组,如使用
r'\d+
,然后在处理结果时跳过每一个不超过五个字符的匹配。

您可能希望在五位字符串前后匹配一个非数字,如
[^0-9]([0-9]{5})[^0-9]
。然后您可以捕获内部组(所需的实际字符串)

如果它们可能发生在最开始或最结尾,那么填充字符串比处理特殊情况更容易

>>> re.findall(r"\D(\d{5})\D", " "+s+" ")
你可以试试

\D\d{5}\D
或许

\b\d{5}\b
但我不确定python是如何处理行尾和空格的


我相信
^\d{5}$
对您不起作用,因为您可能希望获得其他文本中的数字。

注意:使用
\d
时存在问题,因为
\d
匹配任何非数字的字符,请改用
\b
\b
在这里很重要,因为它匹配单词边界,但仅在单词的结尾或开头

import re  

input = "four digits 1234 five digits 56789 six digits 01234,56789,01234"


re.findall(r"\b\d{5}\b", input)  

result : ['56789', '01234', '56789', '01234']
但是如果一个人使用 关于findall(r“\D(\D{5})\D”,s) 输出:['56789','01234'] \D无法处理逗号或任何连续输入的数字

\b在这里是重要的部分,它匹配空字符串,但仅在单词的结尾或开头

import re  

input = "four digits 1234 five digits 56789 six digits 01234,56789,01234"


re.findall(r"\b\d{5}\b", input)  

result : ['56789', '01234', '56789', '01234']
更多文档:

关于
\D
\b
用法的更多说明:

使用
\D
,但它不会捕获所有的五位数

捕获所有五位数字时使用
\b


欢呼声

我在回答中强调了正则表达式中\D和\b之间的差异。
re.findall(r“\D(\D{5})\D”,“15/05/2018 a8711 43160”)
给出了
[]
。给出了什么?@Aetos。答案中说您需要填充此输入字符串。向前看和向后看可以大大降低正则表达式的性能。如果您能报告您发现的内容,我会很感兴趣。我将您的正则表达式更改为使用原始字符串,因为
\b
在其他情况下是一个有效的转义字符字符串。这个答案的问题是,如果其他字母字符连接到数字字符串,例如“56789a”@gnibbler\D也不能处理它!你的意思是
\D
不处理字符串的开头或结尾?我在回答中处理过这个问题。@gnibbler我的意思是它不处理“56789a”56789a“使用
\D
匹配为“56789”,谢谢,事实上,它与解决方案“\b\D{5}\b”和“^[0-9]{5}$”混淆了,谢谢你指出了这一点,后者然后将表达式创建为字符串,这就是我所需要的。这个答案在字符串的开头和结尾都不起作用。例如,它与“12345”@Crayon暴力[^0-9][0-9]{5}[^0-9]不匹配-->您能解释一下这个正则表达式吗?@DhiwakarRavikumar
[^0-9]
任何一个不是数字的字符,后跟
[0-9]{5}
正好5个数字,后跟
[^0-9]
任何一个不是数字的字符第一个正则表达式不适用于“12345”,第二个正则表达式带有“12345a”,不适用于“12345”由于字符串的开头和结尾与[^0-9]不匹配,您的答案是正确的,因此选择作为解决方案的答案不是正确的