【问题标题】:How to search/extract patterns in a string?如何在字符串中搜索/提取模式?
【发布时间】:2019-05-22 06:17:52
【问题描述】:

我想在我的消息中搜索一个模式。 模式是:

1. "aaa-b3-c"
2. "a3-b6-c"
3. "aaaa-bb-c"

我知道如何搜索其中一种模式,但如何搜索所有 3 种模式?

另外,您如何识别和提取以下格式的日期:5/21 或 5/21/2019。

found = re.findall(r'.{3}-.{2}-.{1}', message)

【问题讨论】:

  • a、b 和 c 是一个例子还是应该完全匹配?
  • 示例。它们也可以包含数字。

标签: python regex regex-lookarounds regex-group regex-greedy


【解决方案1】:

试试这个:

found = re.findall(r'a{2,4}-b{2}-c', message)

【讨论】:

  • 我来得太晚了:-/
【解决方案2】:

你可以使用

a{2,4}-bb-c

作为一种模式。


现在您需要检查匹配的真实性:
match = re.search(pattern, string)
if match:
    # do sth. here

Python 3.8 开始,您可以使用walrus 运算符

if (match := re.search(pattern, string)) is not None:
    # do sth. here

【讨论】:

    【解决方案3】:

    试试这个:

    re.findall(r'a.*-b.*-c',message)
    

    【讨论】:

      【解决方案4】:

      第一部分可以是量词 {2,4} 而不是 3。点匹配除换行符以外的任何字符,[a-zA-Z0-9] 将匹配大写或小写字符 a-z 或数字:

      \b[a-zA-Z0-9]{2,4}-[a-zA-Z0-9]{2}-[a-zA-Z0-9]\b
      

      Demo

      如果字符不应成为较长单词的一部分,您可以在任一侧添加单词边界 \b 或锚点 ^$

      对于第二个模式,您还可以使用 \d 和一个量词来匹配一个数字和一个可选的模式来匹配带有 / 和 4 个数字的部分:

      \d{1,2}/\d{2}(?:/\d{4})?
      

      Regex demo

      请注意,格式不会验证日期本身。也许this page 可以帮助您创建/自定义更具体的日期格式。

      【讨论】:

        【解决方案5】:

        在这里,我们可能只想写三个表达式,并从左到右滑动我们的输入以确保安全,并使用逻辑 OR 将它们连接起来,如果我们有更多模式,我们可以简单地添加到它,类似于:

        ([a-z]+-[a-z]+[0-9]+-[a-z]+)
        ([a-z]+[0-9]+-[a-z]+[0-9]+-[a-z])
        ([a-z]+-[a-z]+-[a-z])
        

        这将添加到:

        ([a-z]+-[a-z]+[0-9]+-[a-z]+)|([a-z]+[0-9]+-[a-z]+[0-9]+-[a-z])|([a-z]+-[a-z]+-[a-z])
        

        然后,我们可能想用开始和结束字符来绑定它:

        ^([a-z]+-[a-z]+[0-9]+-[a-z]+)$|^([a-z]+[0-9]+-[a-z]+[0-9]+-[a-z])$|^([a-z]+-[a-z]+-[a-z])$
        

        ^(([a-z]+-[a-z]+[0-9]+-[a-z]+)|([a-z]+[0-9]+-[a-z]+[0-9]+-[a-z])|([a-z]+-[a-z]+-[a-z]))$
        

        正则表达式

        如果不需要此表达式,可以在 regex101.com 中修改或更改它。

        正则表达式电路

        jex.im 可视化正则表达式:

        【讨论】:

          猜你喜欢
          • 2012-11-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-30
          • 2022-01-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多