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

时间:2014-10-14 10:40:52

标签: python regex

我正在试图找到一种方法来编写匹配字符串中任何5位数字的正则表达式,除了那些后跟斜杠。

我无法弄清楚为什么这个RE不起作用:

r"\D(\d{%d})[^/]\D" % 5

示例

'dsadasd894665' -> NO MATCH
'dsadsa78954,4' -> 78954 
'dsda78954/sdd' -> NO MATCH

你有什么想法吗?

4 个答案:

答案 0 :(得分:1)

(?<!\d)(\d{5})(?!\/|\d)

试试这个。这个工作。看看演示。你的正则表达式不会以0宽度断言开始或结束。所以它实际上需要1个字符才能提前2个。

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

答案 1 :(得分:1)

你可以试试下面的正则表达式,

(?<!\d)\d{5}(?=[^\d/]|$)

DEMO

<强>解释

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