【问题标题】:Python regex to find symbol digit symbolPython正则表达式查找符号数字符号
【发布时间】:2016-09-12 09:19:01
【问题描述】:

我用 Python 编写了这个正则表达式,并在 regex101 上对其进行了测试,但它仍然没有按我想要的方式工作:

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

我想要找到的是字符串可选地以这些符号之一开头或结尾的模式,并且中间只有数字:

-/\()& .

此列表包括短划线、正斜杠、反斜杠、括号、& 符号、空格和句点。如果字符串只包含中间的数字,并且字符串的开头和/或结尾有可选的标点符号,则搜索应该返回 true。

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

应该返回 True 的情况:

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

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

(678983y733)..

【问题讨论】:

  • 您肯定会错过模式末尾的$\Z

标签: python regex


【解决方案1】:

您的正则表达式中有几处需要更改。

  • 首先,你有太多的转义内容,这使得阅读起来非常混乱。

  • 其次,括号中发生了奇怪的事情。您不需要任何东西来完全包围正则表达式,因为$0 已经会返回它。

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

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

这是我想出的:

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

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

【讨论】:

  • 谢谢。我不知道]+)?]*) 是等价的。
  • @ChrisNielsen:在这种特殊情况下他们可能会,但总的来说他们当然不会。
【解决方案2】:

我想你要找的是re.fullmatch

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

然后p.fullmatch('(678983y733)') 将返回无, 并且所有其他示例都将返回匹配项。

【讨论】:

  • 当我尝试运行您的代码示例时,我收到此错误:AttributeError: '_sre.SRE_Pattern' object has no attribute 'fullmatch'
  • 你必须有python版本3.4,仅此而已。但是re.escape 函数可能仍然有一些用处,以便清楚起见。
  • 啊,好的。谢谢。我正在使用 2.7。
【解决方案3】:

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

([-\\\/\&\.]?)\b([0-9]+)\b([-\\\/\&\.]?)

【讨论】:

    猜你喜欢
    • 2020-09-08
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 2015-10-29
    • 1970-01-01
    • 2015-04-27
    • 2014-07-31
    相关资源
    最近更新 更多