Python正则表达式匹配所有5位数字,但不匹配更大的数字
我正试图在HTML网页中使用字符串匹配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
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]不匹配,您的答案是正确的,因此选择作为解决方案的答案不是正确的