我正在尝试将遍布HTML网页的5位数优惠券代码串联起来。例如,53232
,21032
,40021
等...我可以使用[0-9]{5}
处理任何5位数字符串的简单情况,但这也匹配6,7 ,8 ... n位数字。有人可以建议我如何修改此正则表达式以匹配仅 5位数字?
答案 0 :(得分:37)
>>> import re
>>> s="four digits 1234 five digits 56789 six digits 012345"
>>> re.findall(r"\D(\d{5})\D", s)
['56789']
如果它们可以在最开始或最后发生,那么填充字符串比处理特殊情况更容易
>>> re.findall(r"\D(\d{5})\D", " "+s+" ")
答案 1 :(得分:11)
完整字符串:^[0-9]{5}$
在字符串中:[^0-9][0-9]{5}[^0-9]
答案 2 :(得分:10)
如果没有填充特殊情况的开始和结束字符串的字符串,就像在John La Rooy中一样,可以使用负数前瞻和后瞻来处理具有单个正则表达式的两种情况
>>> import re
>>> s = "88888 999999 3333 aaa 12345 hfsjkq 98765"
>>> re.findall(r"(?<!\d)\d{5}(?!\d)", s)
['88888', '12345', '98765']
答案 3 :(得分:3)
一种非常简单的方法是匹配所有数字组,例如r'\d+'
,然后在处理结果时跳过每个不超过五个字符的匹配。
答案 4 :(得分:3)
注意:使用\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']
但是如果使用的话 re.findall(r&#34; \ D(\ d {5})\ D&#34;,s) 输出:[&#39; 56789&#39;,&#39; 01234&#39;] \ D无法处理逗号或任何连续输入的数字。
\ b是重要的部分,它匹配空字符串,但只在单词的结尾或开头。
更多文档:https://docs.python.org/2/library/re.html
关于\D
与\b
的使用情况的更多说明:
This example使用\D
,但它不会捕获所有五位数。
This example在捕获所有五位数时使用\b
。
干杯
答案 5 :(得分:1)
您可能希望匹配5位数字符串前后的非数字,例如[^0-9]([0-9]{5})[^0-9]
。然后你可以捕获内部组(你想要的实际字符串)。
答案 6 :(得分:1)
你可以尝试
\D\d{5}\D
或者
\b\d{5}\b
我不确定python如何处理行尾和空格。
我相信^\d{5}$
对您不起作用,因为您可能希望获得其他文本中的数字。