繁体   English   中英

正则表达式-查找不包含某些字符的字符串

[英]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个字符。

http://regex101.com/r/yA5iD9/16

您可以尝试以下正则表达式,

(?<!\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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM