2016-05-16 83 views
1

我用Python写这个正则表达式,并测试了它的regex101,但它仍然没有工作的方式,我想:Python的正则表达式来找到符号数字符号

((^[-\/\\\(\)\s\,\&\.]+)?([0-9]+)([-\/\\\(\)\s\,\&\.])+) 

我想找到的是模式其中串选择性地启动,或与这些符号中的一个端部,并具有在中间ONLY位数:

-/\()& . 

此列表包括短划线,斜杠,背部斜线,括号,连字符,空格,和周期。如果字符串包含ONLY数字,并且在字符串的开头和/或结尾处带有可选的标点符号,则搜索应该返回true。

这个正则表达式似乎适用于大多数情况下,但如果我在中间的数字中添加一个字母失败。它仍然最终返回True。我该怎么做这个正则表达式,以便它只在符号(可选),所有数字,符号(可选)的情况下才返回true?

案例,它应该返回True:

  1. 符号+数字即(9672
  2. 只有数字,即20427304或8
  3. 数字+符号即345--
  4. 符号+数字+符号即(67-。

不应该返回True的情况(因为字符串中的'y'):

(678983y733)..

+0

您肯定会在格式 –

回答

2

您的正则表达式中有几件事需要改变。

  • 首先,你有太多的逃避去那里,这使得阅读非常混乱。

  • 其次,你有奇怪的东西与圆括号发生。你不需要任何东西来完全包围正则表达式,因为$0已经会返回。

  • 您的最后一个字符类在您的正则表达式中不是可选的。

  • 您需要用^$包围所有内容以确保字符串不是部分匹配。

这就是我想出了:

^([-/\\()\s,&.]*)([0-9]+)([-/\\()\s,&.]*)$ 

注意,具有([something]+)?等于([something]*),但后者更具可读性。

+0

结尾错过'$'或'\ Z'谢谢。我不知道'] +)?和'] *)'是等价的。 –

+0

@ChrisNielsen:他们可能在这种特殊情况下,但总的来说他们当然不是。 – Jan

1

我认为你要找的是re.fullmatch

import re 
ponct = '[' + re.escape('-/\()&') + ']*' 
p = re.compile(ponct + '[0-9]+' + ponct) 

然后p.fullmatch('(678983y733)')将返回None, 和所有其他的例子将返回匹配。

+0

当我尝试运行代码示例时,出现此错误: 'AttributeError:'_sre.SRE_Pattern'对象没有'fullmatch''的属性 –

+0

您必须有一个Python版本<'3.4',就是这样。但是为了清晰起见,'re.escape'函数仍然有些用处。 – Jacquot

+0

啊,好的。谢谢。我使用2.7。 –

0

这可以让你找到他们嵌入在一个字符串,而不仅仅是在开始。这个?允许零个或一个符号。如果您想要零个或多个前导/尾随符号,请将其更改为*。

([-\\\/\&\.]?)\b([0-9]+)\b([-\\\/\&\.]?) 
相关问题