【问题标题】:Regex in python. How to simplify my example?python中的正则表达式。如何简化我的示例?
【发布时间】:2015-06-20 10:36:19
【问题描述】:

我是 Python 编程新手。现在我正在努力简化我现有的代码。下面是练习:开发一个匹配电话号码的模式,格式为(xxx) xxx-xx-xx AND xxx-xxx-xx-xx。到目前为止我想出了什么:

patt = "\(?\d{3}\)?\s?-?\d{3}-\d{2}-\d{2}"

完美运行。但问题很明显:如果我有一个可选模式,比如"(specific-patter-ffddff445%$#%)--ds",在某种固定模式之前,我将不得不放“?”可选模式中每个符号之前的符号。如何组合所有符号并仅放置一个“?”标记?

【问题讨论】:

  • 您的问题不清楚。这是一个练习还是一个真正的问题?如果是后者 - 从字符串中删除所有非数字字符并检查您是否留下了 10 位数字。这应该涵盖所有特殊用例。
  • 我也不确定我是否理解。您可以使用组使子模式成为可选:(?:xyz)? 使整个字符串 xyz 成为可选。但是如果你想说每个字符都是可选的,独立于其他字符,你必须写x?y?z?。没有捷径。

标签: python regex


【解决方案1】:

所以你所拥有的匹配各种不正确的格式。例如:

012)345-67-89
(012 345-67-89

您想要的是一个选项,正则表达式为您提供:https://docs.python.org/3.4/library/re.html#regular-expression-syntax

最好是这样的:

patt = '(?:\(\d{3}\) |\d{3}-)\d{3}-\d{2}-\d{2}'

这将匹配任一“(xxx)”或“xxx-”作为“xxx-xx-xx”的前缀。并且不会匹配上面列出的任何一个错误字符串。

? 仅应在其操作的内容是真正可选的情况下使用。

【讨论】:

  • 谢谢,但是如何打印结果?
  • @trollpidor 所以这是第二个问题。太好了,我都在学习。但我鼓励您在提问之前花点时间搜索一下是否已经给出了答案。在这种情况下,您可以在这里找到答案:stackoverflow.com/q/26438345/2642059
  • @trollpidor 如果这解决了您的问题,我建议您单击此答案左侧的复选标记以接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-10
相关资源
最近更新 更多