我正在试图找到一种方法来编写匹配字符串中任何5位数字的正则表达式,除了那些后跟斜杠。
我无法弄清楚为什么这个RE不起作用:
r"\D(\d{%d})[^/]\D" % 5
示例
'dsadasd894665' -> NO MATCH
'dsadsa78954,4' -> 78954
'dsda78954/sdd' -> NO MATCH
你有什么想法吗?
答案 0 :(得分:1)
(?<!\d)(\d{5})(?!\/|\d)
试试这个。这个工作。看看演示。你的正则表达式不会以0宽度断言开始或结束。所以它实际上需要1个字符才能提前2个。
答案 1 :(得分:1)
你可以试试下面的正则表达式,
(?<!\d)\d{5}(?=[^\d/]|$)
<强>解释强>
(?<!\d)
匹配前不会有数字。\d{5}
正好是5位数。(?=[^\d/]|$)
必须后跟一个非数字或/
或行结束锚。<强>代码:强>
>>> import re
>>> s1 = "dsadasd894665"
>>> s2 = "dsadsa78954,4"
>>> s3 = "dsda78954/sdd"
>>> re.search(r'(?<!\d)\d{5}(?=[^\d/]|$)', s1)
>>> re.search(r'(?<!\d)\d{5}(?=[^\d/]|$)', s2)
<_sre.SRE_Match object at 0x7f0835855370>
>>> re.search(r'(?<!\d)\d{5}(?=[^\d/]|$)', s3)
答案 2 :(得分:0)
你的正则表达式无法正常工作的原因是\D
。我不知道你将它们放入的原因。另一个问题是[^/]
与字符串的结尾不匹配,所以请改用?!
。
以下作品:
r"(\d{%d})(?!\/)" % 5
答案 3 :(得分:0)
由于你想要找到自己的数字,即不在另一个数字之前,没有后跟另一个数字,也没有后跟斜杠,我们将使用negative look-aheads and look-behinds来确保:
(?<!\d)\d{5}(?!/|\d)
这将匹配\d{5}
如果不在另一个\d
之前(即没有数字在它之前),它也不后跟另一个\d
或/
。
在您的示例中使用它会产生所需的结果:
>>> for example in ('dsadasd894665', 'dsadsa78954,4', 'dsda78954/sdd'):
print(re.search(r'(?<!\d)\d{%d}(?!/|\d)' % 5, example))
None
<_sre.SRE_Match object; span=(6, 11), match='78954'>
None