![](/img/trans.png)
[英]Python/Regex: Split string if a line does contain a certain special character
[英]Regex - find string which does not contain certain char
我正在尝试寻找一种方法来写正则表达式,该正则表达式与字符串中的任何5位数字匹配,但那些数字后跟斜杠。
我不知道为什么这个RE不起作用:
r"\D(\d{%d})[^/]\D" % 5
例
'dsadasd894665' -> NO MATCH
'dsadsa78954,4' -> 78954
'dsda78954/sdd' -> NO MATCH
你有什么主意吗
(?<!\d)(\d{5})(?!\/|\d)
尝试一下,这有效,请参见demo。您的正则表达式不会以0的宽度断言开头或结尾,因此它实际上需要1个字符和2个字符。
您可以尝试以下正则表达式,
(?<!\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)
您的正则表达式不起作用的原因是\\D
我不知道为什么要将它们放入。另一个问题是[^/]
将不匹配字符串的结尾,因此请使用?!
代替。
以下作品:
r"(\d{%d})(?!\/)" % 5
由于您要查找独立的数字,即不以其他数字开头,不以其他数字开头,也不以斜杠开头的数字,因此我们将使用负的前瞻性和后瞻性来确保这一点:
(?<!\d)\d{5}(?!/|\d)
这将匹配一个\\d{5}
如果它没有被另一个preceeded \\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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.